为什么此代码有时会返回 1E+1 而对于其他输入(例如 17),输出未以科学计数法打印?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
为什么此代码有时会返回 1E+1 而对于其他输入(例如 17),输出未以科学计数法打印?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
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
当.toString()
您将结果传递到System.out.println()
.
行为的确切原理BigDecimal.toString()
在API 文档中以非常详细的(并且几乎难以理解)的方式进行了解释。
要获得一致的(和区域设置敏感的)文本表示,您应该使用DecimalFormat。
这基本上是因为您没有足够的有效数字。如果你将只有 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