发布网友 发布时间:2022-04-26 15:01
共1个回答
热心网友 时间:2023-09-20 10:44
除以7必然涉及到保留两位小数的四舍五入问题,这里使用java的BigDecimal来处理除法,四舍五入的保留方法使用RoundingMode.HALF_EVEN:
RoundingMode.CEILING:取右边最近的整数
RoundingMode.DOWN:去掉小数部分取整,也就是正数取左边,负数取右边,相当于向原点靠近的方向取整
RoundingMode.FLOOR:取左边最近的正数
RoundingMode.HALF_DOWN:五舍六入,负数先取绝对值再五舍六入再负数
RoundingMode.HALF_UP:四舍五入,负数原理同上
RoundingMode.HALF_EVEN:这个比较绕,整数位若是奇数则四舍五入,若是偶数则五舍六入
我认为无论如何都是无法避免四舍五入导致的精度变化的问题,解决方法只能在最后的结果强行再舍掉小数位数:
public class Main {
public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal("10");
BigDecimal seven = new BigDecimal("7");
BigDecimal b1 = bigDecimal.divide(seven, 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal("2"));
System.out.println(b1);
BigDecimal b2 = bigDecimal.divide(seven, 2, RoundingMode.HALF_EVEN);
System.out.println(b2);
BigDecimal b3 = bigDecimal.divide(seven, 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal("2"));
System.out.println(b3);
BigDecimal b4 = bigDecimal.divide(seven, 2, RoundingMode.HALF_EVEN);
System.out.println(b4);
BigDecimal b5 = bigDecimal.divide(seven, 2, RoundingMode.HALF_EVEN);
System.out.println(b5);
System.out.println(b1.add(b2).add(b3).add(b4).add(b5).setScale(0,RoundingMode.HALF_EVEN));
}
}
运行结果: