2013-03-20 5 views
5

ich einen seltsamen Fehler habe, wenn ich Math.floor Funktion auf doppelten Werten verwenden, erhöht von 0,1 jedes Mal.LUA (Corona SDK) Math.floor() gibt falschen Wert mit Zuwachs von 0,1

Es geschieht nur mit einem Zuwachs von 0,1 und beginnen bei Wert 5

Exemple: Math.floor (4) Rück aber Math.floor (5) zurückkehren !!!

Sie können es versuchen, sich mit diesem einfachen Stück Code:

for i=3,7,0.1 do 
    print("val : "..i.." floor : "..math.floor(i)) 
end 

Hier ist das Ergebnis des obigen Codes:

Corona Simulator[1494:707] val : 3 floor : 3 
Corona Simulator[1494:707] val : 3.1 floor : 3 
Corona Simulator[1494:707] val : 3.2 floor : 3 
Corona Simulator[1494:707] val : 3.3 floor : 3 
Corona Simulator[1494:707] val : 3.4 floor : 3 
Corona Simulator[1494:707] val : 3.5 floor : 3 
Corona Simulator[1494:707] val : 3.6 floor : 3 
Corona Simulator[1494:707] val : 3.7 floor : 3 
Corona Simulator[1494:707] val : 3.8 floor : 3 
Corona Simulator[1494:707] val : 3.9 floor : 3 
Corona Simulator[1494:707] val : 4 floor : 4 
Corona Simulator[1494:707] val : 4.1 floor : 4 
Corona Simulator[1494:707] val : 4.2 floor : 4 
Corona Simulator[1494:707] val : 4.3 floor : 4 
Corona Simulator[1494:707] val : 4.4 floor : 4 
Corona Simulator[1494:707] val : 4.5 floor : 4 
Corona Simulator[1494:707] val : 4.6 floor : 4 
Corona Simulator[1494:707] val : 4.7 floor : 4 
Corona Simulator[1494:707] val : 4.8 floor : 4 
Corona Simulator[1494:707] val : 4.9 floor : 4 
Corona Simulator[1494:707] val : 5 floor : 4 
Corona Simulator[1494:707] val : 5.1 floor : 5 
Corona Simulator[1494:707] val : 5.2 floor : 5 
Corona Simulator[1494:707] val : 5.3 floor : 5 
Corona Simulator[1494:707] val : 5.4 floor : 5 
Corona Simulator[1494:707] val : 5.5 floor : 5 
Corona Simulator[1494:707] val : 5.6 floor : 5 
Corona Simulator[1494:707] val : 5.7 floor : 5 
Corona Simulator[1494:707] val : 5.8 floor : 5 
Corona Simulator[1494:707] val : 5.9 floor : 5 
Corona Simulator[1494:707] val : 6 floor : 5 
Corona Simulator[1494:707] val : 6.1 floor : 6 
Corona Simulator[1494:707] val : 6.2 floor : 6 
Corona Simulator[1494:707] val : 6.3 floor : 6 
Corona Simulator[1494:707] val : 6.4 floor : 6 
Corona Simulator[1494:707] val : 6.5 floor : 6 
Corona Simulator[1494:707] val : 6.6 floor : 6 
Corona Simulator[1494:707] val : 6.7 floor : 6 
Corona Simulator[1494:707] val : 6.8 floor : 6 
Corona Simulator[1494:707] val : 6.9 floor : 6 
Corona Simulator[1494:707] val : 7 floor : 6 

Wenn es kann, helfen, wenn wir angewendet, um eine modulo 1 auf das Ergebnis eines fehlerhaften Wertes, erhalten wir dies als Ergebnis: 0.99999999999999

+0

möglich Duplikat [? Warum ist Lua Arithmetik sich nicht gleich] (http://stackoverflow.com/questions/6366954/why-is-lua-arithmetic-is-not-equal-to-self) – finnw

Antwort

4

in der Tat ist es ein gemeinsames Schwimmer Problem,

Hier ist die offizielle Antwort ist i von Corona Unterstützung erhalten haben:

Hallo,

Was Sie sehen, ist eine allgemeine Problem mit Fließkommazahlen. Alle Zahlen in Lua sind Gleitkommazahlen und als solche unterliegen sie Rundungsfehlern. Das Addieren von 0,1 zu einer anderen Fließkommazahl ist nicht genau 0,1 und der Fehler akkumuliert, wenn immer und immer wieder verwendet. Wenn Sie denken, dass die Zahl 5,0 ist, kann es 4,99999999999999999 sein, so dass Boden zurückgibt 4. Die Druckanweisung kann aufgerundet werden, bevor gedruckt wird.

Die Mathebibliothek ist Standardlua-Code (v5.1) und wurde für Corona nicht geändert.

Sie können das Thema oder Gleitkomma Rundung Probleme googeln, aber in allgemein müssen Sie vorsichtig sein, wenn Sie Fließkomma-Mathematik verwenden.

Grüße, Tom

- Corona Labs - Unterstützung [email protected]

4

F Zielpunktnummern sind teuflisch. Verwenden Sie sie nicht als Schleifenzähler.

for i = 30, 70 do 
    local i = i/10 
    print("val : "..i.." floor : "..math.floor(i)) 
end 
+0

Danke, es funktioniert so, aber die Sache ist, ich benutze keine for-Schleife in meinem realen Projekt. Ich verwende einen einfachen Zusatz (um eine Zeichenposition zu aktualisieren). Ich habe versucht, jedes Float in meinem Code mit berechneten Werten (wie 1/10) zu ersetzen und es funktioniert immer noch nicht :( – chip

+0

@ user1029976 - Sie können Rundung auf nächste n/10 verwenden: 'x = math.floor (x * 10 + 0.5)/10 ' –

+0

@ user1029976 das zugrundeliegende Problem ist, dass 0.1 (oder 1/10) keine endliche Binärzahl ist (es ist '0.0001100110011 ...'). Die Gleitkommadarstellung muss das an irgendeinem Punkt begrenzen, weshalb Sie irgendwann Rundungsfehler bekommen. Erhöhen Sie Ihre Zeichenposition um 1, und teilen Sie sie nur dann durch 10, wenn Sie den Wert tatsächlich verwenden. –