我只是想计算percentage_imp,而不是0.22(正好0.22,没有舍入错误),我得到0.22000000000000003 !! 我曾经得到过类似的奇怪结果,而且我被告知从浮动到双重移动,但这个仍然很奇怪! 以下所有变量都是双倍的!
double percentage_imp= budget - (sum_minlessi)/ (sum_i + sum_lessi);
答案 0 :(得分:3)
这是因为浮点精度值。
您必须阅读: - What Every Computer Scientist Should Know About Floating-Point Arithmetic
您还必须阅读how floating point arithmetic and its internal representation works。
答案 1 :(得分:1)
0.22不能表示为双倍。
例如,1/3不能用基数10表示,所以我们用0.3333333333333333近似。
答案 2 :(得分:0)
它在二进制计算中继承了舍入错误。并非所有有理十进制数都可以表示为二进制的单个十进制数。因此,当你执行乘法和除法等操作时,你会在最后几位数上得到一些讨厌的错误。
从double移动到float不会改变这个,因为double只是一个双精度浮点数。
我建议您查看此link
作为java中的额外奖励,尽可能利用任何类型的硬件优化来优化二进制乘法等简单操作,以便在不同的机器上产生不同的答案。如果您需要在所有计算机上保持一致的行为,请在类声明中使用strictfp
关键字。