29

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

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

4 回答 4

48

使用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
于 2009-05-29T09:55:05.113 回答
8

.toString()您将结果传递到System.out.println().

于 2009-05-29T09:54:49.933 回答
3

行为的确切原理BigDecimal.toString()API 文档中以非常详细的(并且几乎难以理解)的方式进行了解释。

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

于 2009-05-29T10:01:05.270 回答
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
于 2009-05-29T10:48:32.663 回答