【问题标题】:BigDecimal from Double incorrect value?Double 中的 BigDecimal 值不正确?
【发布时间】:2010-09-11 23:00:44
【问题描述】:

我正在尝试从字符串中生成 BigDecimal。不要问我为什么,我就是需要!这是我的代码:

Double theDouble = new Double(".3");
System.out.println("The Double: " + theDouble.toString());
BigDecimal theBigDecimal = new BigDecimal(theDouble);
System.out.println("The Big: " + theBigDecimal.toString());

这是我得到的输出?

The Double: 0.3
The Big: 0.299999999999999988897769753748434595763683319091796875

有什么想法吗?

【问题讨论】:

    标签: java double bigdecimal


    【解决方案1】:

    当您创建一个双精度值时,值 0.3 无法准确表示。您可以从没有中间双精度的字符串创建 BigDecimal,如

    new BigDecimal("0.3")
    

    浮点数表示为二进制分数和指数。因此,有些数字无法准确表示。以 10 为底的数字也有类似的问题,例如 1/3,即 0.333333333 ...... 1/3 的任何十进制表示都是不精确的。这发生在二进制分数的不同集合中,0.3 是二进制不精确的集合之一。

    【讨论】:

    • 为什么不能完全用双精度表示?
    • @Diego:如果这不是关于 SO 的最常见问题,至少在前五名中。不过,这需要一点时间来理解。阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic
    • 哎呀,你提供了这个问题的规范答案,并且是你应该用来关闭最近的 similar question 的副本。
    • @HovercraftFullOfEels 我不知道我写了哪些“规范”答案。这差不多是 7 年前的事了 :-)
    • 它经受住了时间的考验。
    【解决方案2】:

    你可以给一个大的小数一个指定的精度。例如附加到您的示例:

    Double theDouble = new Double(".3");
    theBigDecimal = new BigDecimal(theDouble, new MathContext(2));
    System.out.println("The Big: " + theBigDecimal.toString());
    

    这将打印出“0.30”

    【讨论】:

    • 谢谢,但我并不总是知道精度会是多少。我实际从文件中读取的字符串。
    【解决方案3】:

    另一种方法是使用 MathContext.DECIMAL32 保证 7 位精度(在我们的例子中已经足够了):

    Double theDouble = new Double(".3");
    System.out.println("The Double: " + theDouble.toString());
    BigDecimal theBigDecimal = new BigDecimal(theDouble, MathContext.DECIMAL32);  // <-- here
    System.out.println("The Big: " + theBigDecimal.toString());
    

    输出

    The Double: 0.3
    The Big: 0.3000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多