为什么Java BigDecimal返回1E+;1.

为什么Java BigDecimal返回1E+;1.,java,floating-point,bigdecimal,Java,Floating Point,Bigdecimal,为什么该代码有时返回1E+1,而对于其他输入(例如17),输出不是以科学符号打印的 BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros(); System.out.println("value: " + bigDecimal); 将结果传递到System.out.println()时发生的隐式.toString()转换使用: 产

为什么该代码有时返回1E+1,而对于其他输入(例如17),输出不是以科学符号打印的

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

将结果传递到
System.out.println()
时发生的隐式
.toString()
转换使用:

产出:

plain : 10000000 scientific : 10E+6 普通:10000000 科学:10E+6
BigDecimal.toString()
行为的确切原理将在中详细解释(几乎不可理解)


要获得一致的(和地区敏感的)文本表示,您应该使用。

基本上是因为您没有足够的有效数字。如果你把只有一个有效数字的东西乘以100,那么你得到的东西只有一个有效数字。如果它显示为“10”,那么基本上就是说它有两个有效数字。显示它只有一个有效数字的方法是显示“1 x 10^1”

以下两个小数具有相同的值(10),但“刻度”不同(它们开始计算有效数字;顶部有2个sig图,底部有1个):


+1提供实际的解决方案,而不是像我那样“问题就在这里”:像这样的答案是Stackoverflow很棒的原因 plain : 10000000 scientific : 10E+6
System.out.println(new BigDecimal(BigInteger.TEN, 0));  // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1