Java:如何在BigDecimal中去除小数点后的零

26

我有这样一个程序,

BigDecimal bd = new BigDecimal(23.086);
BigDecimal bd1= new BigDecimal(0.000);

bd = bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
bd1 = bd1.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();

System.out.println("bd value::"+ bd);
System.out.println("bd1 value::"+ bd1);
我得到了以下输出:bd23.09bd10.00,但我想让bd1显示为0而不是0.00。我是否正确地应用了这些方法?
9个回答

24

试一下

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class calculator{
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal(23.086);
        BigDecimal bd1= new BigDecimal(0.000);    
        DecimalFormat df = new DecimalFormat("0.##");    
        System.out.println("bd value::"+ df.format(bd));
        System.out.println("bd1 value::"+ df.format(bd1));

    }

}

这将把它转换为一个字符串,你可以用"new BigDecimal(df.format(bd))"来包装它,以再次创建一个BigDecimal。 - Daan

21

假设您有一个值为23000.00 的BigDecimal,并且您想让它变成 23000。 您可以使用方法stripTrailingZeros(),但是它会给您带来“错误”的结果:

BigDecimal bd = new BigDecimal("23000.00");
bd.stripTrailingZeros() // Result is 2.3E+4

您可以通过调用.toPlainString()并将其传递给BigDecimal构造函数来进行修复,以便让它正确处理:

BigDecimal bd = new BigDecimal("23000.00");
new BigDecimal(bd.stripTrailingZeros().toPlainString()) // Result is 23000

15

简洁、清晰、灵活、易于理解和维护的代码

(也适用于double类型)

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2); //Sets the maximum number of digits after the decimal point
df.setMinimumFractionDigits(0); //Sets the minimum number of digits after the decimal point
df.setGroupingUsed(false); //If false thousands separator such ad 1,000 wont work so it will display 1000

String result = df.format(bd);
System.out.println(result);

10
BigDecimal bd  = new BigDecimal(23.086); 
BigDecimal bd1 = new BigDecimal(0.000);

bd  = bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros(); 
bd1 = bd1.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();

System.out.println("bd value::"+ bd); System.out.println("bd1 value::"+ bd1);
System.out.println("new way:" + bd1.intValueExact());

//输出 BD数值:23.09

BD1数值:0.00

新方式:0


1
但是你怎么知道是否应该调用intValueExact?如果正确的话,我想要输出1.1,如果正确的话,输出1。 - Greg Ennis
1
当您想将 BigDecimal 转换为整数时,请调用该函数。但需要捕获 ArithmeticException。如果要转换为 double,请找到一个内置的函数来将 bigdecimal 转换为 double。https://www.tutorialspoint.com/java/math/bigdecimal_intvalueexact.htm - Marcia Ong
1
我同意,但问题不是如何将BigDecimal转换为int,而是如何在输出时格式化,而不带有任何尾随零。对我来说这是两件不同的事情。 - Greg Ennis
1
我明白了,我之前没有遇到过格式输出函数。无法回答你的问题,抱歉。 - Marcia Ong
2
错误的答案,请尝试使用BigDecimal(200.0000),您将得到2E + 2,而不是所需的200。 - Tony BenBrahim

6
您可以使用 printf() 方法 -- %f 格式化符号同样适用于 BigDecimal 类型:
System.out.printf("bd1 value::%.0f%n", bd1);
bd1的值为0。

4

你可以做到这一点

System.out.println("bd value: " + ((bd.scale() == 0) ? bd.unscaledValue() : bd));

2
我认为下面这种方法更好。
    bd1 = bd1.stripTrailingZeros();
    System.out.println(bd1.toPlainString());

打印:

    0

如果bd1 = 1.2300,那么这将会打印出:
    1.23

这与@Gondy的答案有何不同? - magiccrafter

0
我创建了这个方法来解决我的问题...
private BigDecimal removeZeros(BigDecimal bigDecimal){
            return new BigDecimal(bigDecimal.stripTrailingZeros().toPlainString());
        }

我不喜欢它,但是完成工作


1
这与@Gondy的答案有何不同? - Attila T

0
IMO .stripTrailingZeros() 已经是正确的方法。如果目标是仅在小数点后去除尾随零,则可以在调用.stripTrailingZeros()后将精度重置为0,如果精度低于0:
BigDecimal bd = new BigDecimal("100.00");           // bd ==> 100.00
bd = bd.stripTrailingZeros();                       // bd ==> 1E+2
if (bd.scale() < 0)
    bd = bd.setScale(0, RoundingMode.UNNECESSARY);  // bd ==> 100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接