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

本文介绍一种基于BigDecimal的特殊四舍五入算法,该算法先进行常规四舍五入至小数点后两位,随后对最后一位进行特定处理,确保其为0或5。通过示例代码展示了如何实现这一算法。

机试问题—实现基于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,同时稍微注意下精度问题。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值