【发布时间】:2022-01-05 07:34:45
【问题描述】:
当您将 stripTrailingZeros 用于以 0 结尾的数字(如 10、50 等)时。BigDecimal.toString() 方法决定使用科学记数法(而不是 50 打印 5E+1)以下是使用 java 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());
}
我知道两者都是正确的,但我想知道为什么不都返回“50”?
这种不一致很烦人,因为它会在整个应用程序中传播,并且在我的情况下会导致我面向客户端(由人类读取)的 JSON API 中的不一致。
我知道我可以通过使用BigDecimal.toPlainString() 来解决此问题,但仅针对这种情况强制序列化程序(在我的情况下为 Jackson)使用带有额外配置的此方法是错误的。
【问题讨论】:
-
阅读我的完整问题,您会发现为什么
toPlainString对我来说不是一个好选择 -
这是完全正常的,完全按照
BigDecimal的方式工作。 BigDecimals总是存储为number * 10^n。 n 是正数还是负数没有区别。toString()准确反映了存储值的精度。 -
@LouisWasserman 我知道两者都是正确的。困扰我的是 BigDecimal.toString() 结果的不同。表示不一致
-
是的,而且...? BigDecimal 使用该值模拟您拥有多少 precision。
stripTrailingZeros()告诉BigDecimal,“忘记个位的值。甚至不要给我看个位。”50和5E+1不同BigDecimals。new BigDecimal("50").equals(new BigDecimal("5E+1"))是 false。 -
在“50”中,“0”是尾随零。您要求对象剥离这些,但您对此感到不安?
标签: java native bigdecimal strip trailing