Ermitteln Sie die Dezimalzahl einer Eingangsnummer

9

Wir haben ein interessantes Problem, wenn wir die Dezimalgenauigkeit einer Benutzereingabe (Textbox) bestimmen müssen. Im Wesentlichen müssen wir die Anzahl der eingegebenen Dezimalstellen kennen und dann eine Präzisionszahl zurückgeben. Dies wird am besten anhand von Beispielen veranschaulicht:

4500 eingegeben ergibt ein Ergebnis 1
4500.1 eingegeben ergibt ein Ergebnis 0,1
4500.00 eingegeben ergibt ein Ergebnis 0,01
4500,450 eingegeben ergibt ein Ergebnis 0,001

Wir denken daran, mit der Zeichenkette zu arbeiten, das Dezimaltrennzeichen zu finden und dann das Ergebnis zu berechnen. Ich frage mich nur, ob es eine einfachere Lösung dafür gibt.

    
Quinten 19.07.2010, 14:17
quelle

7 Antworten

14

Ich denke, Sie sollten einfach tun, was Sie vorgeschlagen haben - verwenden Sie die Position des Dezimalpunkts. Offensichtlicher Nachteil könnte sein, dass Sie selbst über Internationalisierung nachdenken müssen.

%Vor%

Es gibt eine andere Sache, die Sie ausprobieren könnten - der Decimal Typ speichert einen internen Precission-Wert. Daher könnten Sie Deciml.TryParse() verwenden und den zurückgegebenen Wert überprüfen. Vielleicht behält der Parsing-Algorithmus die Genauigkeit der Eingabe bei.

Schließlich würde ich vorschlagen, etwas nicht mit Fließkommazahlen zu versuchen. Wenn Sie nur die Eingabe analysieren, werden alle Informationen über nachfolgende Nullen gelöscht. Sie müssen also eine künstliche Nullstelle hinzufügen, um sie beizubehalten oder ähnliche Tricks auszuführen. Möglicherweise treten Probleme bei der Präzission auf. Schließlich ist es auch nicht einfach, die Präzession basierend auf einer Gleitkommazahl zu finden. Ich sehe etwas hässliche Mathe oder eine Schleife, die sich mit jeder Iteration mit zehn multipliziert, bis es keinen Bruchteil mehr gibt. Und die Schleife kommt mit neuen Präzisionsproblemen ...

AKTUALISIEREN

Parsing in ein Deciaml funktioniert. Se Decimal.GetBits() für Details.

%Vor%

Von hier mit Math.Pow(0.1, precision) ist einfach.

    
Daniel Brückner 19.07.2010 14:25
quelle
10
  

Ich frage mich, ob es einfacher ist   Lösung dafür.

Nein.

Verwenden Sie eine Zeichenfolge:

%Vor%     
codymanix 19.07.2010 14:24
quelle
8

Da Ihre letzten Beispiele darauf hinweisen, dass abschließende Nullen signifikant sind, würde ich jede numerische Lösung ausschließen und nach den Zeichenfolgenoperationen suchen.

    
Henk Holterman 19.07.2010 14:20
quelle
3

Nein, es gibt keine einfachere Lösung, Sie müssen die Zeichenfolge untersuchen. Wenn Sie "4500" und "4500.00" in Zahlen umwandeln, werden sie beide zum Wert 4500 , sodass Sie nicht erkennen können, wie viele nichtwertige Ziffern hinter dem Dezimaltrennzeichen stehen.

    
Guffa 19.07.2010 14:21
quelle
2

Interessant ist, dass Decimal versucht, die vom Benutzer eingegebene Genauigkeit beizubehalten. Zum Beispiel

%Vor%

Hat Ausgabe von:

%Vor%

Wenn Ihre Motivation, die Genauigkeit der Eingabe zu verfolgen, rein aus Eingabe- und Ausgabegründen besteht, reicht dies möglicherweise aus, um Ihr Problem zu beheben.

    
Brian 19.07.2010 14:29
quelle
1

Die Arbeit mit der Zeichenfolge ist einfach genug.

Wenn es kein "." Gib in der Zeichenfolge 1 zurück.

Else gibt "0" zurück, gefolgt von n-1 "0", gefolgt von einer "1", wobei n die Länge der Zeichenfolge nach dem Dezimalpunkt ist.

    
Amnon 19.07.2010 14:24
quelle
1

Hier ist eine mögliche Lösung mit Strings;

%Vor%

Hier ist eine Frage; Berechne System.Dezimale Präzision und Skalierung was aussieht, als ob es von Interesse wäre, wenn Sie möchten etwas mehr vertiefen.

    
Christopher McAtackney 19.07.2010 14:34
quelle