记录---基于BigDecimal的特殊的四舍五入

机试问题—实现基于BigDecimal的特殊的四舍五入。

这是一道外企的机试题,我把里面的某个难点部分,摘出来详细如下:
//实现特殊的四舍五入,先普通四舍五入取到小数点后两位,然后最后一位向后进位,0和5不变,1234变5,6789进1变0
也就是说最后一位要么是0,要么是5
// 2.201–>2.20
// 2.20–>2.20
// 2.23–>2.25
// 2.25–>2.25
// 2.26–>2.30
我的思路很简单,是将BigDecimal转换成int,然后利用取余取整,完成特殊的四舍五入的这个规则,然后再转成BigDecimal,注意精度即可。

import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) {

        //1.输入start
        double start = 2.445;
        BigDecimal input = new BigDecimal(start).setScale(2, BigDecimal.ROUND_HALF_UP);
        
        //2.小数点后两位四舍五入,然后乘以100,取整数
        int res = input.multiply(new BigDecimal(100)).intValue();
        System.out.println("input:" + input.toPlainString());
        System.out.println("res:" + res);

        int a = res;
        int b = a % 10;
        int c = a / 10;
        System.out.println("--" + a + "--" + b + "--" + c + "--");
        //3.取整数后根据题意,将尾数变成自定义的样子
        if (b == 0) {
            a = c * 10;
        } else if(b <= 5) {
            a = c * 10 + 5;
        } else {
            a = c * 10 + 10;
        }
        System.out.println(a);

        //4.最后输出时再除以100,为最终的结果值
        BigDecimal output = new BigDecimal(a).divide(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("output:" + output.toPlainString());



    }
}

总结

本文是自定义四舍五入,也同样适用于其他规则,只需要将自定义那块的逻辑换掉即可,
本文核心是将BigDecimal转换成int,同时稍微注意下精度问题。

这种方法只是临时想的,不一定是最好的,

如果发现有问题或者更好的实现,欢迎继续探讨。

你可能感兴趣的:(java基础)