Konvertieren von float nach int in F #

7

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.

    
Lee Richardson 04.01.2009, 16:31
quelle

5 Antworten

11

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.

    
Pedro Henriques 04.01.2009, 16:45
quelle
5
  

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%     
Alexey Romanov 05.01.2009 14:14
quelle
5

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.

%Vor%     
Alexey Romanov 05.01.2009 14:21
quelle
2

Um eine float -Nummer in eine int zu konvertieren, verwenden Sie:

let i = Convert.ToInt32(f)

    
katrash 19.10.2015 18:05
quelle
1

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.

    
Mark Maxham 04.01.2009 16:52
quelle

Tags und Links