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.
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.
Von hier mit Math.Pow(0.1, precision)
ist einfach.
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.
Interessant ist, dass Decimal
versucht, die vom Benutzer eingegebene Genauigkeit beizubehalten. Zum Beispiel
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.
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.
Tags und Links c# precision decimal decimal-point