我做以下
MathContext context = new MathContext(7, RoundingMode.HALF_UP);
BigDecimal roundedValue = new BigDecimal(value, context);
// Limit decimal places
try {
roundedValue = roundedValue.setScale(decimalPlaces, RoundingMode.HALF_UP);
} catch (NegativeArraySizeException e) {
throw new IllegalArgumentException("Invalid count of decimal places.");
}
roundedValue = roundedValue.stripTrailingZeros();
String returnValue = roundedValue.toPlainString();
如果输入现在为“-0.000987654321”(=值),我会返回“-0.001”(=返回值),这是正常的。
如果输入现在为“-0.0000987654321”,我会回到“-0.0001”,这也没关系。
但是当输入现在是“-0.00000987654321”时,我得到“0.0000”而不是“0”,这是不行的。这有什么不对?为什么在这种情况下不删除尾随零?
答案 0 :(得分:8)
BigDecimal d = new BigDecimal("0.0000");
System.out.println(d.stripTrailingZeros());
答案 1 :(得分:1)
从BigDecimal的stripTrailingZeros:
的描述中“返回一个BigDecimal,它在数值上等于此值,但从表示中删除了任何尾随零。例如,从BigDecimal值600.0中剥离尾随零,其中[BigInteger,scale]组件等于[6000, 1],产生6E2,[BigInteger,scale]分量等于[6,-2]“
换句话说,它不会做你想做的事。而是使用setScale(0)方法。我写的以下测试代码给出了以下输出:
BigDecimal d = new BigDecimal("0.0000");
System.out.println(d.toString());
d = d.setScale(0);
System.out.println(d.toString());
0.0000
0
编辑:当为0.0001执行此操作时,您会收到错误消息。您还需要设置舍入模式。 (setScale的重载)你必须弄清楚要解决的问题。