Modulo不起作用

het*_*lek 6 java modulo

我知道这似乎是一个非常愚蠢的问题,但我不明白为什么这不起作用.这个:

 System.out.println(5 % .10);
Run Code Online (Sandbox Code Playgroud)

它正在回归:

0.09999999999999973
Run Code Online (Sandbox Code Playgroud)

我真的不知道.我只是在学习Java,而且我对C#非常好,所以我尝试用C#来.C#似乎也回归了同样的事情.

Mys*_*ial 8

这是由于浮点精度.0.10无法用二进制表示.因此,结果并不完全0.10,因此不会被修改为0.

这将起作用0.25因为0.25 可以用二进制表示.

编辑:

通常,任何可以表示为分母中具有2次幂的分数的数字都可以精确地表示在IEEE浮点中.(假设它没有上溢/下溢)


Cha*_*win 8

正如其他人所解释的那样,这是由于浮点精度造成的不准确.

你应该使用BigDecimal,在这种情况下是包含小数的精确算术的余数方法.

BigDecimal number = new BigDecimal(5);
BigDecimal divisor = new BigDecimal("0.1");
BigDecimal result = number.remainder(divisor);
System.out.println(result); // 0
Run Code Online (Sandbox Code Playgroud)