我有以下代码:
Double x = 17.0;
Double y = 0.1;
double remainder = x.doubleValue() % y.doubleValue();
当我跑步时,我得到余数= 0.09999999999999906
知道为什么??
我基本上需要检查x是否可被y完全整除。你能否在java中建议其他方法呢?
由于
答案 0 :(得分:11)
由于浮点数的表示方式。
如果您需要准确的值,请使用BigDecimal
:
BigDecimal remainder = BigDecimal.valueOf(x).remainder(BigDecimal.valueOf(y));
另一种方法是将每个值乘以10(或100,1000),强制转换为int
,然后使用%
。
答案 1 :(得分:4)
您需要比较允许舍入误差的结果。
if (remainder < ERROR || remainder > 0.1 - ERROR)
此外,如果您要使用double
答案 2 :(得分:1)
This帖子可以帮助你。它解释了为什么你会看到这种行为,并讨论了BigDecimal类。
答案 3 :(得分:1)
期望双算术的精确结果在计算机上存在问题。基本的罪魁祸首是我们人类主要使用基数10,而计算机通常在基数2中存储数字。两者之间存在转换问题。
此代码将执行您想要的操作:
public static void main(String[] args) {
BigDecimal x = BigDecimal.valueOf(17.0);
BigDecimal y = BigDecimal.valueOf(0.1);
BigDecimal remainder = x.remainder(y);
System.out.println("remainder = " + remainder);
final boolean divisible = remainder.equals(BigDecimal.valueOf(0.0));
System.out.println("divisible = " + divisible);
}