我有一些简单的代码可以四舍五入,但是却产生了一些意想不到的结果。
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
double a = 46.66;
System.out.println("Roundup: " + roundUp(a,2) + "\nRound Down: " + roundDown(a,2));
}
public static double roundUp(double a, int scale)
{
BigDecimal value = new BigDecimal(a);
value = value.setScale(scale, RoundingMode.UP);
return value.doubleValue();
}
public static double roundDown(double a, int scale)
{
BigDecimal value = new BigDecimal(a);
value = value.setScale(scale, RoundingMode.DOWN);
return value.doubleValue();
}
当我在小数点后使用3位数字时,它按预期方式工作。如果a = 44.661,则输出如下所示。
综述:46.67综述:46.66
当a = 44.66时,舍入值减小1,这是意外的,如下所示。
综述:46.66综述:46.65
我如何获得四舍五入的44.66和四舍五入的44.67,同时仍保留上述结果。
在此先感谢您的帮助
最佳答案
那是因为您并没有真正使用BigDecimals,而是使用了double。当您键入44.66
时,它将转换为双精度值,这将导致其值略小于44.66。 BigDecimal
无法解决在输入输入之前已经发生的舍入错误。
试试这个吧。
public static void main(String[] args) throws Exception {
BigDecimal a = new BigDecimal("46.66");
System.out.println("Roundup: " + roundUp(a,2) + "\nRound Down: " + roundDown(a,2));
}
public static BigDecimal roundUp(BigDecimal a, int scale)
{
return a.setScale(scale, RoundingMode.UP);
}
public static BigDecimal roundDown(BigDecimal a, int scale)
{
return a.setScale(scale, RoundingMode.DOWN);
}
关于java - Java BigDecimal向下舍入问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12010449/