为什么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