当其标度值为零时,我需要删除BigDecimal
值的小数部分。例如,
BigDecimal value = new BigDecimal("12.00").setScale(2, RoundingMode.HALF_UP);
它会分配12.00
。我希望在这种情况下仅将12
分配给value
。
BigDecimal value = new BigDecimal("12.000000").setScale(2, RoundingMode.HALF_UP);
应指定12
,
BigDecimal value = new BigDecimal("12.0001").setScale(2, RoundingMode.HALF_UP);
应指定12
。
BigDecimal value = new BigDecimal("12.0051").setScale(2, RoundingMode.HALF_UP);
应指定12.01
BigDecimal value = new BigDecimal("00.000").setScale(2, RoundingMode.HALF_UP);
应指定0
。
BigDecimal value = new BigDecimal("12.3456").setScale(2, RoundingMode.HALF_UP);
应该分配12.35
等。这可能吗?什么是最好的方法?
答案 0 :(得分:6)
这可能吗?什么是最好的方法?
可能是stripTrailingZeros()
。
检查你的测试:
public static void main(final String[] args) {
check(truncate("12.000000"), "12");
check(truncate("12.0001"), "12");
check(truncate("12.0051"), "12.01");
check(truncate("12.99"), "12.99");
check(truncate("12.999"), "13");
check(truncate("12.3456"), "12.35");
System.out.println("if we see this message without exceptions, everything is ok");
}
private static BigDecimal truncate(final String text) {
BigDecimal bigDecimal = new BigDecimal(text);
if (bigDecimal.scale() > 2)
bigDecimal = new BigDecimal(text).setScale(2, RoundingMode.HALF_UP);
return bigDecimal.stripTrailingZeros();
}
private static void check(final BigDecimal bigDecimal, final String string) {
if (!bigDecimal.toString().equals(string))
throw new IllegalStateException("not equal: " + bigDecimal + " and " + string);
}
输出:
如果我们看到此消息没有例外,一切正常
答案 1 :(得分:1)
以下代码使用正则表达式和BigDecimal
的构造执行您指定的内容,它可能不是最有效的方法:
BigDecimal value = new BigDecimal("12.0000").setScale(2, RoundingMode.HALF_UP);
Pattern pattern = Pattern.compile("\\d+\\.(\\d)0");
Matcher matcher = pattern.matcher(value.toString());
if (matcher.find()) {
if (matcher.group(1).equals("0"))
value = value.setScale(0);
else
value = value.setScale(1);
}
注意:这也使12.100 - > 12.1,我认为这是想要的功能。
答案 2 :(得分:1)
我不是手动修改原始值,而是尝试应用某些条件,例如
String text="123.008";
BigDecimal bigDecimal=new BigDecimal(text);
if(bigDecimal.scale()>2)
{
bigDecimal=new BigDecimal(text).setScale(2, RoundingMode.HALF_UP);
}
if(bigDecimal.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO)==0)
{
bigDecimal=new BigDecimal(text).setScale(0, BigDecimal.ROUND_HALF_UP);
}
System.out.println("bigDecimal = "+bigDecimal);
如果比例大于2,则第一个if
条件检查。如果是,则执行指定的舍入操作。
如果小数部分的值为零,则下一个if
条件检查。如果是,则截断它。两个BigDecimal对象的值相等但具有不同的比例(如2.0和2.00)被compareTo()
方法视为相等。因此,只要将小数部分的值评估为零,就满足条件。
否则,原始值保持不变(如果比例为1或2)。
如果我遗漏了某些内容或者实施起来是错误的,那么请澄清一下。
答案 3 :(得分:0)
试试这个:
new BigDecimal("12.3456").setScale(2, RoundingMode.FLOOR).stripTrailingZeros()