机试问题—实现基于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,同时稍微注意下精度问题。
本文介绍一种基于BigDecimal的特殊四舍五入算法,该算法先进行常规四舍五入至小数点后两位,随后对最后一位进行特定处理,确保其为0或5。通过示例代码展示了如何实现这一算法。
508

被折叠的 条评论
为什么被折叠?



