我怀疑以前有人问过这个问题,但似乎找不到匹配的问题...
我正在使用 Scala,但我很确定这只是一个 Java 问题...输入值是 double 值
println(28.0 / 5.6)
println(28.0 % 5.6)
这几行的结果是
5.0
1.7763568394002505E-15
这意味着 Java 正在正确执行除法,但由于某种原因导致模数错误,因为对于任何解析为整数的除法问题,模数应该为 0...
有解决办法吗?
谢谢!
最佳答案
5.0 只是表明 Java 理解的精确结果比任何其他 double 值更接近 5.0。这并不意味着操作的精确结果是正好 5。
现在,当您询问模数时,您可以得到更精细的细节,因为结果不再固定为具有“5”部分。
这不是一个很好的解释,但想象一下您有一个精度为 4 位的十进制 浮点类型。 1000/99.99 和 1000 % 99.99 的结果是什么?
嗯,实际结果从 10.001001 开始 - 所以您必须将其四舍五入为 10.00。但是,余数是 0.10,您可以表示。所以,看起来除法给了你一个整数,但它并不完全。
考虑到这一点,请记住 5.6 的字面值 实际上 5.5999999999999996447286321199499070644378662109375。现在很明显 28.0(*可以)除以该数字不等于 5。
编辑:现在,如果您使用BigDecimal
执行decimal 浮点运算的结果,则该值确实是 正好是 5.6,并且有没问题:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal x = new BigDecimal("28.0");
BigDecimal y = new BigDecimal("5.6");
BigDecimal div = x.divide(y);
BigDecimal rem = x.remainder(y);
System.out.println(div); // Prints 5
System.out.println(rem); // Prints 0.0
}
}
关于java - Java 模运算符的错误结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083625/