我想知道如何将浮点数舍入到机器浮点数(例如双)。数字"0.01111116“不能用机器浮点表示,在某些四舍五入的模式下,这个数字应该表示为"0.011111159999999995”,有一定的精度损失。但是我不知道怎么用Java来完成这个任务?因此,我想知道API设置舍入模式,以获得机器浮点数在Java中的准确表示。谢谢!
发布于 2013-05-18 02:42:20
如果您在程序源代码中讨论的是一个文本0.01111116,则Java编译器在编译时将其转换为二进制浮点表示形式。
如果您正在谈论一个包含字符"0.01111116“的字符串,如果/当您调用(例如) Double.parseDouble(...)时,该字符串将转换为二进制浮点表示形式。
无论哪种方式,转换都是在幕后进行的,您无法控制实际的四舍五入。但从某种意义上说,这是毫无意义的。某些四舍五入的发生是表象的本质所固有的,其结果通常是从数学的角度来看“最精确的”。给定您所选择的浮点类型。
如果您真的希望转换使用不同的舍入/截断规则,您可以在事实发生后这样做(例如,圆整或截断转换的值),或者您可以实现您自己的字符串到浮点转换方法。
您将无法改变Java编译器转换文本的方式。它是语言规范的一部分。
因此,我想知道API设置舍入模式,以获得机器浮点数在Java中的准确表示。
还有一种思考这个问题的方法。
机器浮点数的精确表示是32位或64位二进制数据。您可以通过几种方式将double的比特呈现为十六进制:
Double::doubleToLongBits或Double::doubleToRawLongBits后面跟着Long::toHexString提供了精确但没有帮助的呈现,或者Double::toHexString给出了十六进制浮点表示。所有这些渲染都是double的精确表示(没有舍入错误),但大多数读者不会理解它们。(“原始”版本最适合处理涉及变体NaN值的边缘情况。)
对于float,有一些等价的方法。
发布于 2013-05-18 11:41:40
Java规范不提供任何方法来控制浮点舍入模式.使用圆到最近。
通常不可能安排浮点算法来产生精确的数学结果,所以软件的设计必须能够容忍和调整错误,或者在非常特殊的情况下,使用额外的注意来获得精确的结果。
发布于 2013-05-18 02:43:50
试试公域-计算3精度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.3https://stackoverflow.com/questions/16620039
复制相似问题