我除以两个数字466489/249001,这导致了不终止的十进制展开。
当
BigDecimal类以几乎无限的精度存储浮点数时,我已经开始使用它了。
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计算的那样
发布于 2014-03-10 11:49:26
您应该能够提供具有自定义精度的MathContext实例。
dividend.divide(divisor, new MathContext( 100 ) ); //whatever precision you need发布于 2014-03-10 11:56:49
您可以通过适当的四舍五入来设置刻度以实现这一点。
System.out.println(dividend.divide(divisor,49,BigDecimal.ROUND_HALF_UP));我得到以下输出: 1.8734422753322275814153356813828056915434074561950
发布于 2014-03-10 12:01:17
除了其他人发布的涉及使用MathContext的解决方案之外,一个好的Rational类可能总是有用的。
请参阅这里以获得一个好的版本。
您应该将您的数字保持为Rational,以保持完全的准确性,并且只在保存它时将其呈现为十进制--当然,在这一点上,您需要再次截断。
这是有可能恢复不准确的--但不是以可靠的方式,它需要一些数学。有关我的技巧,请参阅这里。
https://stackoverflow.com/questions/22299173
复制相似问题