在这个循环中,我不是 获得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
答案 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
可能会使程序在处理货币时更容易理解。