代码之家  ›  专栏  ›  技术社区  ›  parkr

为什么Java BigDeMalk返回1E+ 1?

  •  25
  • parkr  · 技术社区  · 15 年前

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

    BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
    System.out.println("value: " + bigDecimal);
    
    4 回复  |  直到 15 年前
        1
  •  41
  •   dfa    15 年前

    使用 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());
    

    输出:

    plain      : 10000000
    scientific : 10E+6
    
        2
  •  7
  •   Jordan S. Jones    15 年前

    这是隐性的 .toString() 将结果传递到 System.out.println() .

        3
  •  3
  •   Michael Borgwardt    15 年前

    行为的确切理由 BigDecimal.toString() 解释见 API doc 在伟大的(和近乎无法理解的)细节。

    要获得一致的(和区分区域设置的)文本表示,应该使用 DecimalFormat .

        4
  •  3
  •   newacct    15 年前

    基本上是因为你没有足够的有效数字。如果你把只有1个有效数字的东西乘以100,那么你就得到只有1个有效数字的东西。如果它显示“10”,那么基本上就是说它有两个有效数字。只显示1个有效数字的方法是显示“1 x 10^1”。

    以下两个小数具有相同的值(10),但不同的“刻度”(开始计算有效数字;顶部有2个sig figs,底部有1个):

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