为什么Java BigDecimal会返回1E + 1?

时间:2009-05-29 09:51:03

标签: java floating-point bigdecimal

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

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

4 个答案:

答案 0 :(得分:41)

使用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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

BigDecimal.toString()行为的确切理由在API doc中解释了很好(且难以理解)的细节。

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

答案 3 :(得分:3)

这主要是因为您没有足够的有效数字。如果你将只有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