0

Ich habe ein kleines Problem und ich kann keine Lösung finden!Problem mit Schwimmer in Objective-C

Mein Code ist (dies ist nur ein Beispielcode, aber mein Original-Code so etwas tun):

float x = [@"2.45" floatValue]; 


for(int i=0; i<100; i++) 
    x += 0.22; 

NSLog(@"%f", x); 

der Ausgang ist 52,450001 und nicht 52,450000!

Ich weiß nicht, weil das passiert!

Danke für jede Hilfe!

~ ~ GELÖST

Danke an alle! Ja, ich habe mit dem Doppeltyp gelöst!

+1

hannos Link erklärt das Problem. Dieses spezielle Beispiel würde nicht mit einem Double anstelle eines Floats auftreten, aber der gleiche grundlegende Fehler existiert. – JimG

+0

Doppel wird jedoch für andere Zahlen brechen. Versuchen Sie die Dezimalzahl –

Antwort

6

Floats eine Zahlendarstellung mit einer gewissen Präzision sind. Nicht jeder Wert kann in diesem Format dargestellt werden. Siehe auch here.

Sie können leicht denken, warum dies der Fall sein würde: Es gibt eine unbegrenzte Anzahl von Nummern nur im Intervall (1..1), aber ein Float hat nur eine begrenzte Anzahl von Bits, um alle Zahlen darzustellen (-MAXFLOAT..MAXFLOAT).

Genauer gesagt: In einer 32-Bit-Integer-Darstellung gibt es eine abzählbare Anzahl von darzustellenden ganzen Zahlen. Aber es gibt unendlich viele reale Werte, die in einer begrenzten Darstellung von 32 oder 64 Bit nicht vollständig dargestellt werden können. Daher gibt es nicht nur eine Grenze für den höchsten und niedrigsten darstellbaren realen Wert, sondern auch für die Genauigkeit.

Also warum hat eine Zahl, die kleine Ziffern nach dem Gleitkomma betroffen hat? Da die Darstellung auf einem Binärsystem statt einer Dezimalzahl basiert, können andere Zahlen leicht dargestellt werden, dann die Dezimalzahlen.

2

Fließkommazahlen können von Computern nicht immer einfach dargestellt werden. Dies führt zu Ungenauigkeiten in einigen Ziffern.

Es ist wie ich fragen Sie, was 1/3 in Dezimal ist. Egal, wie sehr du es versuchst, du wirst mir nicht sagen können, was es ist, weil dezimal diese Zahl nicht genau beschreiben kann.

Floats können einige Dezimalzahlen nicht genau beschreiben.