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