Java 使用双入环。四舍五入可能存在的问题

Java 使用双入环。四舍五入可能存在的问题,java,rounding,Java,Rounding,我有一个关于我今天看到的循环的小问题。看起来是这样的: for (double i = 0.0; i < 1.0; i += 0.1) { for (double j = i; j < 1.0; j += 0.1) { double k = i + j; if ((k % 1) == 0) { System.out.println(i + " + " + j + " = " + k);

我有一个关于我今天看到的循环的小问题。看起来是这样的:

for (double i = 0.0; i < 1.0; i += 0.1) {  
    for (double j = i; j < 1.0; j += 0.1) {  
        double k = i + j;  
         if ((k % 1) == 0) {  
            System.out.println(i + " + " + j + " = " + k);  
        }  
    }  
}
for(双i=0.0;i<1.0;i+=0.1){
对于(双j=i;j<1.0;j+=0.1){
双k=i+j;
如果((k%1)==0){
System.out.println(i+“+”+j+“=”+k);
}  
}  
}
它应该输出0和1之间的两个数字的总和(递增0.1),这两个数字等于一个整数。但是,由于某些原因,它没有显示0.1+0.9=1.0和。我猜这可能是因为双精度格式的数字表示不正确(即0.3+0.1不是0.4,而是039999999)


是否有人可以确认这确实是问题所在,并建议如何纠正?非常感谢您的帮助

当您执行类似操作时,您希望使用BigDecimal,以避免浮点类型的舍入问题

为什么不使用
int
s-从
0
开始,直到
10
,步骤为
1
?然后
如果(k%10)==0

您可以尝试打印数字并验证您的怀疑。如果您必须处理
数字,您可以选择查看目标值的增量是否足够小


另一方面,如果你知道你的步长总是0.1,为什么不把所有涉及的数字乘以10呢?如果需要的话,你可以通过除以10将其转换为double。

你对浮点数表示法的猜测是对的,我不同意你称它们为“不正确”


人类用十进制表示实数,计算机用二进制表示。在绝对值中,0.4可能很难用二进制表示,同样地,0.0101可能很难用基数3表示。如果要避免舍入问题,应该使用BigDecimal,或者使用整数并将其视为“十分之一或百分之多少”与绝对值。这是一种计算货币的方法(使用整数或长整数和计算美分,而不是使用浮点数或小数和计算美元)

有很多相同的问题,所以……二进制数总是很容易用十进制表示,因为2是10的一个因子。但正如你们所说,十进制0.4不能精确地用二进制表示。谢谢,我明白了。我(没有成功)试图展示价值表征的差异。更新。