划分两个数字而不会丢失精度

时间:2014-03-10 11:44:13

标签: java precision bigdecimal

我将两个数字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

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

现在我想知道如何使用WolframAlpha计算的BigDecimal来获得更精确的结果?

3 个答案:

答案 0 :(得分:2)

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

dividend.divide(divisor, new MathContext( 100 ) ); //whatever precision you need

答案 1 :(得分:0)

您可以使用适当的舍入来设置比例以实现此目的

System.out.println(dividend.divide(divisor,49,BigDecimal.ROUND_HALF_UP));

我得到以下输出:1.8734422753322275814153356813828056915434074561950

答案 2 :(得分:0)

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

请参阅here以获得一个好的。

您应该将您的号码保持为Rational以保持完整的准确性,并在保存时仅将其渲染为小数 - 此时,您需要再次截断。

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