首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有办法在Java中设置浮点单位的舍入模式吗?

有办法在Java中设置浮点单位的舍入模式吗?
EN

Stack Overflow用户
提问于 2013-05-18 02:09:34
回答 3查看 1.7K关注 0票数 3

我想知道如何将浮点数舍入到机器浮点数(例如双)。数字"0.01111116“不能用机器浮点表示,在某些四舍五入的模式下,这个数字应该表示为"0.011111159999999995”,有一定的精度损失。但是我不知道怎么用Java来完成这个任务?因此,我想知道API设置舍入模式,以获得机器浮点数在Java中的准确表示。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-18 02:42:20

如果您在程序源代码中讨论的是一个文本0.01111116,则Java编译器在编译时将其转换为二进制浮点表示形式。

如果您正在谈论一个包含字符"0.01111116“的字符串,如果/当您调用(例如) Double.parseDouble(...)时,该字符串将转换为二进制浮点表示形式。

无论哪种方式,转换都是在幕后进行的,您无法控制实际的四舍五入。但从某种意义上说,这是毫无意义的。某些四舍五入的发生是表象的本质所固有的,其结果通常是从数学的角度来看“最精确的”。给定您所选择的浮点类型。

如果您真的希望转换使用不同的舍入/截断规则,您可以在事实发生后这样做(例如,圆整或截断转换的值),或者您可以实现您自己的字符串到浮点转换方法。

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

因此,我想知道API设置舍入模式,以获得机器浮点数在Java中的准确表示。

还有一种思考这个问题的方法。

机器浮点数的精确表示是32位或64位二进制数据。您可以通过几种方式将double的比特呈现为十六进制:

  • Double::doubleToLongBitsDouble::doubleToRawLongBits后面跟着Long::toHexString提供了精确但没有帮助的呈现,或者
  • Double::toHexString给出了十六进制浮点表示。

所有这些渲染都是double的精确表示(没有舍入错误),但大多数读者不会理解它们。(“原始”版本最适合处理涉及变体NaN值的边缘情况。)

对于float,有一些等价的方法。

票数 1
EN

Stack Overflow用户

发布于 2013-05-18 11:41:40

Java规范不提供任何方法来控制浮点舍入模式.使用圆到最近。

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

票数 5
EN

Stack Overflow用户

发布于 2013-05-18 02:43:50

试试公域-计算3精度http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Precision.html

代码语言:javascript
复制
    double d = 0.1 + 0.2;
    System.out.println(d);
    d = Precision.round(d, 1);  <-- 1 decimal place
    System.out.println(d);

输出

代码语言:javascript
复制
0.30000000000000004
0.3
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16620039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档