网站首页 > java教程 正文
在java的Math类中,有一个round方法来获得指定精度的整数或者小数,在笔试的时候有时候也会考到Math.round(10.5)和Math.round(-10.5)的值分别是多少?
分别是11和-10,因为Math.round()采用的是正无穷方向的舍入规则。那么这么做在舍入很频繁的银行利息计算或者我们在项目中遇到的比较复杂的业务逻辑的时候,是肯定行不通的,因为如果四舍五入的话,肯定是对一方不利的,比如结算的时候,4453.4舍去0.4,4453.5进1,那么对于付款方一直是在亏损的,这样肯定是不行的。四舍五入的算法误差是由美国银行家发现的,并且提出了一个修正算法,叫做银行家舍入的近似算法,它的规则如下:
舍去位的数值小于5时直接舍去
舍去位的数值大于6时,进位后舍去
当舍去位的数值等于5时,分两种情况:5后面还有其他数字(非0),则进位后舍去;若5后面是0(即5是最后一个数字),则根据5前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。
总的的一句话就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。比如说(都取两位精度):①10.5551=10.56(五后非零就进一)②10.555=10.56(五后为零看奇偶,五前为奇要进一)③10.545=10.54(五后为零看奇偶,五前为偶应舍去)。
而在java5版本以上就已经引入了银行家算法,直接使用RoundingMode类的Round模式就可以了,下面看一个简单的例子。
小数取精度
在这个程序中,我们使用BigDecimal类,并且用setScale方法设置了精度,同时传递了一个RoundingMode.HALF_EVEN参数表示使用的是银行家算法进行近似运算,目前java支持七种舍入方式:
ROUND_UP:远离零方向舍入(也就是说向绝对值最大的方向舍入,只要舍弃位非零就进位,此时的-10.5和10.5的舍入值为-11和11)
ROUND_DOWN:趋向零方向舍入(向0方向靠拢,所有位都舍去,不存在进位情况,此时的-10.5和10.5的舍入值为-10和10)
ROUND_CEILING:向正无穷方向舍入(向正最大方向靠拢,这就是Math.round方法的模式了,此时的-10.5和10.5的舍入值为-10和11)
ROUND_FLOOR:向负无穷方向舍入(如果是正数,则舍入行为类似于第二种,如果是负数,则舍入行为类似于第一种,此时的-10.5和10.5的舍入值为-11和10.)
HALF_UP:这就是我们最经典的四舍五入(此时的-10.5和10.5的舍入值为-11和11)
HALF_DOWN:最近数字舍入(5舍,在这个模式中四舍五入的时候5是不进位的,此时的-10.5和10.5的舍入值为-10和10)
HALF_EVEN:银行家算法。
所以在我们普通的项目中舍入方式采用Math.round不会有太大影响,但是利息计算之类的复杂的业务逻辑的项目中,就要选择好近似的模式,尽量避免因为这个误差造成损失。
猜你喜欢
- 2024-09-16 mysq时间进位问题(mysql 当前时间函数)
- 2024-09-16 Java程序员们请你不要用战术上的勤奋掩盖你自己站略上的懒惰
- 2024-09-16 Java中存储金额用什么数据类型?(java用什么数据类型表示金额)
- 2024-09-16 java 坐标类_java实现坐标(java中坐标)
- 2024-09-16 MySQL常用函数,程序员真得看看(mysql函数用法)
- 2024-09-16 Java中Double保留后小数位的几种方法
- 2024-09-16 Java面试官问我10道题,我答错了一半,你能答对多少?
- 2024-09-16 java.util.Math类--数学相关的工具类
- 2024-09-16 一张图彻底搞懂Java取整函数ceil、floor、round的区别!建议收藏
- 2024-09-16 Java中的金额处理的精度问题(java金额比较大小方法)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)