计算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); }