有没有办法在Java中设置浮点单元的舍入模式?

时间:2013-05-18 02:09:34

标签: java floating-point precision

我想知道如何将浮点数舍入到机器浮点数(例如 double )。 数字“0.01111116”不能用机器浮点表示,在某些舍入模式下,该数字应表示为“0.011111159999999995”,但有一定的精度损失。 但我不知道如何在Java中完成此操作? 所以我想知道API来设置舍入模式以获得Java中机器浮点数的精确表示。 谢谢!

3 个答案:

答案 0 :(得分:4)

Java specification没有提供任何控制浮点舍入模式的方法。使用舍入到最近。

通常不可能安排浮点运算来产生数学上精确的结果,因此必须设计软件以容忍和调整错误,或者在非常特殊的情况下,通过使用额外的小心来获得精确的结果。

答案 1 :(得分:0)

如果您在程序的源代码中讨论文字0.01111116,Java编译器会在编译时将其转换为二进制浮点表示。

如果您正在谈论(比方说)包含字符“0.01111116”的字符串,如果/当您调用时(例如Double.parseDouble(...),它将被转换为二进制浮点表示

无论哪种方式,转换都发生在幕后,您无法控制实际的舍入。但从某种意义上说,这是没有意义的。表示的本质是固有的,有些舍入发生,结果通常是从数学角度可以得到的“最准确”。

如果您真的希望转换使用不同的舍入/截断规则,您可以在事后执行此操作(例如,舍入或截断转换后的值),或者您可以实现自己的String到浮点转换方法。

您将无法更改Java编译器转换文字的方式。它是语言规范的一部分。

答案 2 :(得分:0)

尝试commons-math3 Precision http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html

    double d = 0.1 + 0.2;
    System.out.println(d);
    d = Precision.round(d, 1);  <-- 1 decimal place
    System.out.println(d);

输出

0.30000000000000004
0.3