【问题标题】:Why does Java BigDecimal return 1E+1?为什么 Java BigDecimal 返回 1E+1?
【发布时间】:2009-05-29 09:51:03
【问题描述】:

为什么此代码有时会返回 1E+1,而对于其他输入(例如 17),输出未以科学计数法打印?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);

【问题讨论】:

    标签: java floating-point bigdecimal


    【解决方案1】:

    使用bigDecimal.toPlainString():

     BigDecimal bigDecimal = BigDecimal.valueOf(100000.0)
                         .multiply(BigDecimal.valueOf(100d))
                         .stripTrailingZeros();
     System.out.println("plain      : " + bigDecimal.toPlainString());
     System.out.println("scientific : " + bigDecimal.toEngineeringString());
    

    输出:

    平原:10000000 科学:10E+6

    【讨论】:

    • +1 提供了一个实际的解决方案,而不是像我一样“这是问题所在”。 :)
    • 这样的答案让 Stackoverflow 变得很棒
    • 但为什么 stripTrailingZeros 强制 java 以科学格式打印?例如 ``` System.out.println("with stripTrailingZeros: " + new BigDecimal("-50").stripTrailingZeros()); System.out.println("没有 stripTrailingZeros:" + new BigDecimal("-50")); ```
    【解决方案2】:

    当您将结果传递给 System.out.println() 时,会发生隐式的 .toString() 转换。

    【讨论】:

      【解决方案3】:

      BigDecimal.toString() 行为的确切原理在 API doc 中详细解释(几乎难以理解)。

      要获得一致的(和区域敏感的)文本表示,您应该使用DecimalFormat

      【讨论】:

        【解决方案4】:

        这基本上是因为您没有足够的有效数字。如果你将只有 1 个有效数字的东西乘以 100,那么你会得到只有 1 个有效数字的东西。如果它显示“10”,则基本上表示它有 2 个有效数字。显示它只有 1 个有效数字的方法是显示“1 x 10^1”。

        以下两位小数具有相同的值 (10),但“刻度”不同(它们从有效数字开始计数;顶部有 2 个 sig 无花果,底部有 1):

        System.out.println(new BigDecimal(BigInteger.TEN, 0));  // prints 10
        System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 1970-01-01
          • 2011-08-14
          • 2012-01-25
          相关资源
          最近更新 更多