Kann jemand bitte erklären, warum int (0.4 * 10.0)
ist 4
noch int ((2.4 - 2.0) * 10.0)
ist 3
?
Und dann bitte erklären Sie auch, wie Sie 4
bekommen. Muss ich wirklich int (System.Math.Round((2.4 - 2.0) * 10.0))
machen?
Es ist nur so hässlich für etwas, das so einfach sein sollte.
Die doppelte Darstellung von 2.4 - 2.0 ist 0.399999999999. Wenn Sie eine Zahl in int konvertieren, wird der Dezimalteil abgeschnitten, sodass 3.999999999 auf 3 gekürzt wird.
Und dann bitte erklären Sie auch, wie Sie 4 bekommen. d. Muss ich wirklich
machen?int (System.Math.Round ((2.4 - 2.0) * 10.0))
es ist nur so hässlich für etwas, das so einfach sein sollte.
Natürlich nicht, definiere einfach
%Vor% Tatsächlich gibt es in .Net einen decimal
-Datentyp, der Ihnen bei diesem Problem helfen wird, wenn Ihre Zahlen genau als Dezimalbrüche dargestellt werden können.
Gleitkommazahlen sind keine unendliche Genauigkeit. Einige Zahlen können perfekt dargestellt werden (alles mit Zweierpotenzen, z. B. 1, 1/2 = 0,5, 1/4 = 0,25 usw.), andere nicht (z. B. 1/3 kann nicht genau in eine endliche Sequenz zerlegt werden) von Zweiermächten). Wenn Sie das Ende der unendlichen Reihe zerhacken, ist die codierte Version einer Zahl oft etwas kleiner als der wahre Wert.
Kombinieren Sie dies mit der Tatsache, dass der (int) -Operator eher kappt als rundet, und Sie können in Fällen auftreten, in denen eine Operation, die zu 4.0 führt, 3.999999999991 statt 3 ergibt.
Jedes Mal, wenn Sie Floats / Doubles in Ints konvertieren möchten, sollten Sie genau überlegen, welchen Operator Sie verwenden möchten - Abschneiden (Abrunden), Abrunden oder Runden auf den nächsten.
Da dies ein Problem mit Fließkommadarstellungen ist, gilt dies nicht nur für F #, sondern auch für C # und (IIRC) Java und andere Sprachen.
Tags und Links f#