为什么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].
当您使用 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].