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

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

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

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

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

BigDecimal.toString()行为的确切原理在API文档中解释了很多(并且几乎难以理解)的细节。

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

这主要是因为您没有足够的有效数字。 如果你将只有1个有效数字的东西乘以100,那么你得到的东西只有1个有效数字。 如果它显示“10”那么基本上它表示它有2位有效数字。 显示它的方式只有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