Har*_*Joy 1 java floating-point for-loop
可能重复:
java for-loop问题
为什么输出以下代码:
for (float j2 = 0.0f; j2 < 10.0f; j2+=0.1f) {
System.out.println(j2);
}
Run Code Online (Sandbox Code Playgroud)
这个:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
1.0000001
1.1000001
1.2000002
1.3000002
1.4000002
1.5000002
1.6000003
1.7000003
1.8000003
1.9000003
2.0000002
2.1000001
2.2
2.3
2.3999999
2.4999998
2.5999997
2.6999996
2.7999995
2.8999994
2.9999993
3.0999992
3.199999
3.299999
3.399999
3.4999988
3.5999987
3.6999986
3.7999985
3.8999984
3.9999983
4.0999985
4.1999984
4.2999983
4.399998
4.499998
4.599998
4.699998
4.799998
4.8999977
4.9999976
5.0999975
5.1999974
5.2999973
5.399997
5.499997
5.599997
5.699997
5.799997
5.8999968
5.9999967
6.0999966
6.1999965
6.2999964
6.3999963
6.499996
6.599996
6.699996
6.799996
6.899996
6.9999957
7.0999956
7.1999955
7.2999954
7.3999953
7.499995
7.599995
7.699995
7.799995
7.899995
7.9999948
8.099995
8.199995
8.299995
8.399996
8.499996
8.599997
8.699997
8.799997
8.899998
8.999998
9.099998
9.199999
9.299999
9.4
9.5
9.6
9.700001
9.800001
9.900002
Run Code Online (Sandbox Code Playgroud)
还有一个问题:即使我将for循环的条件改为j2<=10.0f输出也是一样的.为什么这样?它不应该包含10.0在输出中吗?
正如其他人所提到的,它是关于浮点数的精确度以及每个操作步骤都可能增加错误的事实.
这就是为什么你从不使用花车代表钱.查看BigDecimal以获得精确的十进制处理.
10.0不包括的原因是总和已浮动且不再<= 10.0,因为精度/舍入误差已经漂移到+0.0以上.9.900002 + 0.1可能会产生类似10.000002的值,大于10.0.
浮点数不表示为精确数字,而是表示为系数和指数,例如(?1)^s × c × b^q并且添加到浮点数将结合两个数字的不确定性.由于精度损失,这可能转化为0.70000005而不是0.7.
查看http://en.wikipedia.org/wiki/IEEE_754-2008