我已经把这个问题解决了,就像我能得到它一样简单。随意尝试相同的事情,并告诉我,如果你得到相同的错误,你可能有什么解决方案。我已经在几台电脑上试过了。
float total = 200000.0f + 154196.8f;
NSLog(@"total: %f", total);
输出结果为:
total: 354196.812500
如果有人有任何逻辑解释,请随时分享。
答案 0 :(得分:13)
我建议你刷你的花车
http://www.altdevblogaday.com/2012/05/20/thats-not-normalthe-performance-of-odd-floats/
如果您需要更高的精度,请使用双倍。
另外http://randomascii.wordpress.com/2012/03/08/float-precisionfrom-zero-to-100-digits-2/
答案 1 :(得分:7)
有关所有深刻理解,请参阅What Every Programmer Should Know About Floating-Point Arithmetic。简短的回答是,所有浮点表示都对其精度有限制,并且可以用十进制中的少量数字表示的事物可能无法用二进制的少量数字表示(特别是浮点格式中不能表示) )。
请注意,尽管double
可以改善事物,但它并非灵丹妙药。即使使用double
,也会出现小的舍入错误。当你期望2时,你很容易得到1.99999999。
答案 2 :(得分:3)
提示:
long double total = 200000.0 + 154196.8;
NSLog(@"total: %Lf", total);
在我的机器上打印正确的值 32位浮点具有23位尾数,最接近的值为0.5 + 0.25 + 0.125 您应该使用更多位来获得正确的表示。