【问题标题】:BigDecimal stripping trailing zerosBigDecimal 去除尾随零
【发布时间】:2020-10-29 18:19:20
【问题描述】:

我有一个 BigDecimal 值,并希望删除尾随零直到某个点。以下是一些示例:

1.00000 -> 1.0
12.2    -> 12.2
19.9300 -> 19.93

请注意第一种情况,当所有小数都为零时,我们希望保留一个小数位。我想避免使用stripTrailingZeros(),因为在某些情况下它可以转换为科学记数法(例如 1E+1)

编辑:在这种情况下,BigDecimal 的比例已设置为大于 5 的值。

【问题讨论】:

  • 您只是想更改 BigDecimal 的字符串表示形式还是实际更改其比例和/或精度?
  • 比例已经设置为某个较高的值,例如 8。但是,这应该只适用于非零数字。例如,0.1234567890 应该变成 0.12345678

标签: java bigdecimal


【解决方案1】:

您确实需要使用stripTrailingZeros() 来消除零,但您可以使用setScale() 来确保至少得到小数点后一位。

for (String s : new String[] { "1.00000", "12.2", "19.9300", "1e+10", "1e-10", "0" }) {
    BigDecimal value = new BigDecimal(s);
    
    value = value.stripTrailingZeros();
    if (value.scale() < 1)
        value = value.setScale(1);
    
    System.out.println(value);
}

输出

1.0
12.2
19.93
10000000000.0
1E-10
0.0

如果你不想要1E-10,那么你必须调用toPlainString(),因为这就是普通的toString()会输出这么小的值。

【讨论】:

  • @Spectric 我提供了指向 javadoc 的链接。我鼓励人们学习真正阅读 javadoc,而不是简单地重复这里所说的内容。我知道,让人们阅读文档,我是多么邪恶。 ??
  • @Andreas 对不起,但我忘了提到在我提供的所有这些案例中比例已经高于 1。假设它可能像 8 一样高
  • @user3696953 您说:“删除尾随零直到某个点”,然后指定该点为小数点后 1 位,并提供输入比例为的示例分别为 5、1 和 4。此代码完全按照您的要求执行,而不关心原始比例是多少。您可以将比例设置为 100,它仍会删除所有尾随零,在小数点后至少保留一位数字,如我添加的额外示例所示。
  • @Andreas 你说得对,我在阅读时误读了你的代码
猜你喜欢
  • 2021-10-15
  • 2013-07-20
  • 2020-09-16
  • 2011-11-01
  • 2014-09-02
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多