BigDecimal.Divide给出错误的结果

时间:2016-02-23 23:48:10

标签: java math bigdecimal

使用BigDecimal执行除法时得到的结果不正确。 number1 = 221500.0 number2 = 12.0 这是我的代码片段:

BigDecimal d1 = new BigDecimal(String.valueOf(number1)).setScale(13, 4);
BigDecimal d2 = new BigDecimal(String.valueOf(number2)).setScale(13, 4);
return (d1.divide(d2, 13, 4 )).doubleValue();

18458.333333333332

如果我使用它给出的计算器执行相同的计算 18458.333333333333333333333333333

让我知道在BigDecimal中处理比例的任何问题。如果有人让我知道如何用计算器得到相同的结果,将会很有帮助。

2 个答案:

答案 0 :(得分:4)

您向divide()调用了13位数的精度,这就是它给你的。

然后将其转换为double并注意double无法处理该精度。

BigDecimal d1 = new BigDecimal(String.valueOf(221500.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d2 = new BigDecimal(String.valueOf(12.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d3 = d1.divide(d2, 13, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal: " + d3);
System.out.println("as double : " + d3.doubleValue());

<强>输出

BigDecimal: 18458.3333333333333
as double : 18458.333333333332

如果您要丢弃使用BigDecimal获得的额外精确度,为什么不在double进行数学运算?

另一方面:
不要做new BigDecimal(String.valueOf(doubleValue)) 使用BigDecimal.valueOf(doubleValue)

设置d1d2的比例似乎毫无意义 除非明确需要,否则尽可能晚,如果有的话。

答案 1 :(得分:3)

有些事情你会做不同的事情。

如您所知,BigDecimal是一个很棒的工具,因为:

  • 它可以精确地保留十进制数字,不像任何浮点表示,例如 double float

  • 它可以使用任意大十进制数,与 int double float

  • 不同

然而,为了使其有效,你应该记住一些事情:

  • 将值设置为BigDecimal时,始终使用字符串表示形式,因为只有String表示形式才能处理小数精度。例如,新的BigDecimal(String.valueOf(number1))是个坏主意,如果number是double(无法处理精确的小数),那么你将把不准确的数字转换为BigDecimal。

  • 创建BigDecimal时不要限制精度。通常BigDecimal会保持输入的精度,即新的BigDecimal(“3.234”)将有3位十进制数字。

  • 在每次除法后设置roudingMode。有关可能的路由模式,请参阅JavaDoc,HALF_EVEN是常用用例的最佳选择。

  • 在除法时设置小数精度,因为除法可能会导致无穷小的小数。

考虑这个例子:

public class BigDecimalTest {

    public static void main(final String[] args) {
        final BigDecimal d1 = new BigDecimal("221500");
        final BigDecimal d2 = new BigDecimal("12");
        final BigDecimal result=d1.divide(d2,30,RoundingMode.HALF_EVEN);
        System.out.println(result);
    }

}

给出了

  

18458.333333333333333333333333333333

请求所有30位小数。随意改变30到300,这给了

  

18458.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

很多比计算器好,不是吗? :)

相关问题