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

时间:2011-04-05 13:09:38

标签: java double

我有以下代码:

Double x = 17.0;
Double y = 0.1;

double remainder = x.doubleValue() % y.doubleValue();

当我跑步时,我得到余数= 0.09999999999999906

知道为什么??

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

由于

4 个答案:

答案 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

,请不要使用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);

}