计算java中两个双精度的余数

我有以下代码:

Double x = 17.0; Double y = 0.1; double remainder = x.doubleValue() % y.doubleValue(); 

当我运行这个时,我得到余数= 0.09999999999999906

知道为什么??

我基本上需要检查x是否可被y完全整除。 你能在java中建议其他方法吗?

谢谢

因为如何表示浮点数。

如果需要精确值,请使用BigDecimal

 BigDecimal remainder = BigDecimal.valueOf(x).remainder(BigDecimal.valueOf(y)); 

另一种方法是将每个值乘以10(或100,1000),转换为int ,然后使用%

您需要比较允许舍入误差的结果。

 if (remainder < ERROR || remainder > 0.1 - ERROR) 

另外,当你的意思是使用double时,不要使用Double

这篇文章可以帮到你。 它解释了为什么你会看到这种行为,并讨论BigDecimal类。

期望双算术的精确结果在计算机上是有问题的。 基本的罪魁祸首是我们人类主要使用基数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); }