为什么此代码有时会返回 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());

输出:

plain      : 10000000
scientific : 10E+6

其他提示

这是当你结果传递到.toString()正在发生隐式System.out.println()转换。

行为的确切理由 BigDecimal.toString() 解释于 API文档 非常详细(并且几乎难以理解)。

为了获得一致的(并且区域设置敏感的)文本表示,您应该使用 十进制格式.

这基本上是因为你没有足够的显著数字。如果你乘的东西,只有1位显著100,那么你只有1显著位的东西。如果显示“10”,那么,基本上说,它有2个显著数字。的方式来显示它只有1位显著是显示“1×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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top