为什么Java BigDecimal stripTrailingZeros 导致科学记数法

Why Java BigDecimal stripTrailingZeros leads to scientific notation

当您使用 stripTrailingZeros 处理以零结尾的数字,如 10、50 等时 BigDecimal.toString() 方法决定使用科学记数法(而不是 50 打印 5E+1)这是使用 [=22= 测试的示例代码] 17:

public static void main(String[] asd)
{
    // prints: "with stripTrailingZeros: 5E+1"
    System.out.println("with stripTrailingZeros: " + new BigDecimal("50").stripTrailingZeros());

    // prints: "without stripTrailingZeros: 50"
    System.out.println("without stripTrailingZeros: " + new BigDecimal("50").toString());
}

我知道两者都是正确的,但我想知道为什么不是 return“50”?

这种不一致很烦人,因为它会在整个应用程序中传播,在我的情况下会导致我的 JSON API 中的不一致,这是面向客户端的(由人类读取)。

我知道我可以通过使用 BigDecimal.toPlainString() 来解决这个问题,但是强制序列化程序(在我的例子中是 Jackson)使用这种方法并针对这种情况进行额外配置感觉不对。

来自 stripTrailingZeros() 的 API 文档:

Returns a BigDecimal which is numerically equal to this one but with any trailing zeros removed from the representation.

您还希望它 returns 是什么? “5”?

感谢@yshavit 的评论。专注于我使用小数并删除小数部分尾随零的案例,我完全忘记了它也会从非小数部分删除零。因此预计从 new BigDecimal("50").stripTrailingZeros().toString() 到 return “5E+1”(没有尾随零)而不是“50”(有尾随零)。来自 stripTrailingZeros() 文档:

For example, stripping the trailing zeros from the BigDecimal value 600.0, which has [BigInteger, scale] components equal to [6000, 1], yields 6E2 with [BigInteger, scale] components equal to [6, -2].