为什么此代码有时会返回1E + 1,而对于其他输入(例如17),输出不会以科学记数法打印?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
答案 0 :(得分:41)
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