java - Java 模运算符的错误结果?

标签 java floating-point floating-accuracy modulo

我怀疑以前有人问过这个问题,但似乎找不到匹配的问题...

我正在使用 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/

相关文章:

c# - 如何从同一个 XLIFF 翻译文件生成 .resx 和 .properties 文件

java - 运行时是否会忽略断言语句?

c++ - 为什么 float 计算和转换在调试和发布配置中显示不同的结果?

python - 如何将十六进制转换为 IEEE float python

ruby - 在 Ruby 的 BigDecimal 中是否使用 String 或 Integer

C++ float vs double cout setprecision 奇怪之处(新手)

用于替换 System.out.println 模式的 Java 正则表达式

java - 关于 Java 正则表达式的问题

c - 如何从二进制文件读取和写入 float ?

c++ - 类似浮点函数的不同结果