【问题标题】:Why Java BigDecimal stripTrailingZeros leads to scientific notation为什么 Java BigDecimal stripTrailingZeros 会导致科学记数法
【发布时间】: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 使用该值模拟您拥有多少 precisionstripTrailingZeros() 告诉 BigDecimal,“忘记个位的值。甚至不要给我看个位。” 505E+1 不同 BigDecimals。 new BigDecimal("50").equals(new BigDecimal("5E+1"))false
  • 在“50”中,“0”是尾随零。您要求对象剥离这些,但您对此感到不安?

标签: java native bigdecimal strip trailing


【解决方案1】:

来自stripTrailingZeros()的API文档:

返回一个 BigDecimal,它在数值上等于这个值,但带有 从表示中删除的任何尾随零。

您还期望它返回什么? “5”?

【讨论】:

  • 不,我希望 new BigDecimal().toString() 返回“50”而不是“50”和“5E+1”
  • 所以你根本不应该在隐式调用toString()..之前调用将其转换为“5E+1”表示的方法。
  • 在我的情况下这是不可能的。我需要使用.stripTrailingZeros(),因为有时数字就像 123.22000 等,我需要删除尾随零
【解决方案2】:

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

例如,从 BigDecimal 值 600.0(其 [BigInteger, scale] 分量等于 [6000, 1])中去除尾随零,得到 6E2,其中 [BigInteger, scale] 分量等于 [6, -2]。

【讨论】:

  • 很高兴提供清除它的洞察力。 :-) 干杯!
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多