首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除以两个数而不损失精度

除以两个数而不损失精度
EN

Stack Overflow用户
提问于 2014-03-10 11:44:13
回答 3查看 2.2K关注 0票数 3

我除以两个数字466489/249001,这导致了不终止的十进制展开

BigDecimal类以几乎无限的精度存储浮点数时,我已经开始使用它了。

代码语言:javascript
复制
    BigDecimal dividend = BigDecimal.valueOf(466489L);
    BigDecimal divisor  = BigDecimal.valueOf(249001L);
    System.out.println((double)466489/249001);
    //1.8734422753322275
    System.out.println(dividend.divide(divisor, MathContext.DECIMAL128));
    //1.873442275332227581415335681382806

WolframAlpha我得到的结果如下

1.87344227533222758141533568138280569154340745619495504034120344898213260187710089517712780269958755185722145694193999220...

所以我想我的结果是精确的。

现在,我想知道如何才能在使用BigDecimal的结果中获得更高的精度,正如WolframAlpha计算的那样

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-10 11:49:26

您应该能够提供具有自定义精度的MathContext实例。

代码语言:javascript
复制
dividend.divide(divisor, new MathContext( 100 ) ); //whatever precision you need
票数 3
EN

Stack Overflow用户

发布于 2014-03-10 11:56:49

您可以通过适当的四舍五入来设置刻度以实现这一点。

代码语言:javascript
复制
System.out.println(dividend.divide(divisor,49,BigDecimal.ROUND_HALF_UP));

我得到以下输出: 1.8734422753322275814153356813828056915434074561950

票数 0
EN

Stack Overflow用户

发布于 2014-03-10 12:01:17

除了其他人发布的涉及使用MathContext的解决方案之外,一个好的Rational类可能总是有用的。

请参阅这里以获得一个好的版本。

您应该将您的数字保持为Rational,以保持完全的准确性,并且只在保存它时将其呈现为十进制--当然,在这一点上,您需要再次截断。

这是有可能恢复不准确的--但不是以可靠的方式,它需要一些数学。有关我的技巧,请参阅这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22299173

复制
相关文章

相似问题

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