在java for循环使用' double'价值没有得到确切的价值

时间:2016-01-08 06:20:18

标签: java

在这个循环中,我不是 获得3.9的价值。 它停在3.8

for(double a=0.0;a<=3.9; a+=0.1) 
    System.out.println((double) Math.round(a * 10) / 10);

输出:

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8

5 个答案:

答案 0 :(得分:2)

double没有无限精度,并且数字0.1在二进制中无法精确表示。无论如何,您可以使用格式化的io和< 4之类的

for (double a = 0.0; a < 4; a += 0.1) {
    System.out.printf("%.1f%n", a);
}

提供请求的输出。

答案 1 :(得分:1)

双重算术通常不能给出准确的值。使用BigDecimal或整数除以10。

答案 2 :(得分:1)

尝试以下方法以更好地了解循环的行为方式。

double a = 0.0;
for(;a<=3.9; a+=0.1)
  System.out.println(a);
System.out.println(a);

你可以采用的另一种方式是改变你的状况。我会警告这一点,因为你没有解决浮点错误这么简单,只需要解决它。

for(double a=0.0;((double)Math.round(a*10)/10) <= 3.9; a+=0.1)
  System.out.println((double) Math.round(a * 10) / 10);

答案 3 :(得分:0)

双重操作有一些精度问题。使用BigDecimal操作而不是double将获得预期的结果。 或者将循环中的变量a与4而不是3.9进行比较。

for(double a=0.0;a<=4; a+=0.1)
        System.out.println((double) Math.round(a * 10) / 10);

它会给你想要的结果。

答案 4 :(得分:0)

确保工作正常的最简单方法:

for (int a = 0; a <= 39; a++) {
    System.out.println((double)a/10);
}

在现实世界中,尽可能使用整数仍然是最好的,尽管BigDecimal可能会使程序在处理货币时更容易理解。