BigDecimal 去除尾随零

Posted

技术标签:

【中文标题】BigDecimal 去除尾随零【英文标题】:BigDecimal stripping trailing zeros 【发布时间】: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 【参考方案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 你说得对,我在阅读时误读了你的代码

以上是关于BigDecimal 去除尾随零的主要内容,如果未能解决你的问题,请参考以下文章

没有科学记数法的回声数,同时去除尾随零和小数点

从 SQL Server 中的十进制中删除尾随零

bigdecimal的使用

BigDecimal类型比较大小

bigdecimal的使用

从变量中去除尾随空格