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