Java 中的数字四舍五入到小数点后两位
Rounding numbers to two decimal places in Java
我需要将数字四舍五入到小数点后两位:
1.1245 → 1.13
1.1235 → 1.12
过去两天我一直在搜索 Whosebug,但我一直无法找到任何我发现有效的解决方案:
- What rounding method should you use in Java for money?
- Rounding BigDecimal to always have two decimal places
- Using DecimalFormat
他们似乎都只是简单地截断小数点后第三位的数字,然后从那里四舍五入,这不是我想要做的。我试图从最右边的地方开始,然后开始适当地四舍五入; 5-9上去,0-4没效果被掉
这是我正在使用的当前代码:
BigDecimal a = new BigDecimal("1.1245");
double b = Math.round(a.doubleValue() * 100) / 100;
System.out.print(a.setScale(2, BigDecimal.ROUND_HALF_EVEN) + " : "
+ a.setScale(2, BigDecimal.ROUND_HALF_UP) + " : "
+ b);
这里是控制台的直接输出:
这里的问题是我期望 1.13 是上述所有情况的结果,就好像遵循以下过程一样:
1.1245 → 1.125 → 1.13
1.1235 → 1.124 → 1.12
public static double Rnd(double d)
{
d *= 100;
d += .5;
d = (int)d;
d /= 100;
return d;
}
这是我学到的最好的四舍五入方法,因为两个100可以调整到不同的地方
我认为您应该仔细检查您的规范,因为这种要求并不常见。无论如何,我认为这可以满足您(似乎)的需要:
public BigDecimal round(BigDecimal n, int scale) {
if (n.scale() > scale) {
return round(n.setScale(n.scale() - 1, RoundingMode.HALF_UP), scale);
} else {
return n.setScale(scale, RoundingMode.UNNECESSARY);
}
}
我会用标准四舍五入测试距离,然后再次调整和四舍五入:
for (String string : new String[] {"1.1245", "1.1244", "1.1235", "1.1249", "1.1299"}) {
BigDecimal a = new BigDecimal(string);
if (a.setScale(2, BigDecimal.ROUND_HALF_UP).subtract(a).compareTo(new BigDecimal("-0.0044")) < 0) {
System.out.println(string + ":" + a.add(new BigDecimal("0.001")).setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
System.out.println(string + ":" + a.setScale(2, BigDecimal.ROUND_HALF_UP));
}
}
结果:
1.1245:1.13
1.1244:1.12
1.1235:1.12
1.1249:1.13
1.1299:1.13
我需要将数字四舍五入到小数点后两位:
1.1245 → 1.13 1.1235 → 1.12
过去两天我一直在搜索 Whosebug,但我一直无法找到任何我发现有效的解决方案:
- What rounding method should you use in Java for money?
- Rounding BigDecimal to always have two decimal places
- Using DecimalFormat
他们似乎都只是简单地截断小数点后第三位的数字,然后从那里四舍五入,这不是我想要做的。我试图从最右边的地方开始,然后开始适当地四舍五入; 5-9上去,0-4没效果被掉
这是我正在使用的当前代码:
BigDecimal a = new BigDecimal("1.1245");
double b = Math.round(a.doubleValue() * 100) / 100;
System.out.print(a.setScale(2, BigDecimal.ROUND_HALF_EVEN) + " : "
+ a.setScale(2, BigDecimal.ROUND_HALF_UP) + " : "
+ b);
这里是控制台的直接输出:
这里的问题是我期望 1.13 是上述所有情况的结果,就好像遵循以下过程一样:
1.1245 → 1.125 → 1.13
1.1235 → 1.124 → 1.12
public static double Rnd(double d)
{
d *= 100;
d += .5;
d = (int)d;
d /= 100;
return d;
}
这是我学到的最好的四舍五入方法,因为两个100可以调整到不同的地方
我认为您应该仔细检查您的规范,因为这种要求并不常见。无论如何,我认为这可以满足您(似乎)的需要:
public BigDecimal round(BigDecimal n, int scale) {
if (n.scale() > scale) {
return round(n.setScale(n.scale() - 1, RoundingMode.HALF_UP), scale);
} else {
return n.setScale(scale, RoundingMode.UNNECESSARY);
}
}
我会用标准四舍五入测试距离,然后再次调整和四舍五入:
for (String string : new String[] {"1.1245", "1.1244", "1.1235", "1.1249", "1.1299"}) {
BigDecimal a = new BigDecimal(string);
if (a.setScale(2, BigDecimal.ROUND_HALF_UP).subtract(a).compareTo(new BigDecimal("-0.0044")) < 0) {
System.out.println(string + ":" + a.add(new BigDecimal("0.001")).setScale(2, BigDecimal.ROUND_HALF_UP));
} else {
System.out.println(string + ":" + a.setScale(2, BigDecimal.ROUND_HALF_UP));
}
}
结果:
1.1245:1.13
1.1244:1.12
1.1235:1.12
1.1249:1.13
1.1299:1.13