专业的JAVA编程教程与资源

网站首页 > java教程 正文

怎么让四舍五入都不亏?(怎么四舍五入到个位)

temp10 2024-09-16 05:16:03 java教程 13 ℃ 0 评论

在java的Math类中,有一个round方法来获得指定精度的整数或者小数,在笔试的时候有时候也会考到Math.round(10.5)和Math.round(-10.5)的值分别是多少?

分别是11和-10,因为Math.round()采用的是正无穷方向的舍入规则。那么这么做在舍入很频繁的银行利息计算或者我们在项目中遇到的比较复杂的业务逻辑的时候,是肯定行不通的,因为如果四舍五入的话,肯定是对一方不利的,比如结算的时候,4453.4舍去0.4,4453.5进1,那么对于付款方一直是在亏损的,这样肯定是不行的。四舍五入的算法误差是由美国银行家发现的,并且提出了一个修正算法,叫做银行家舍入的近似算法,它的规则如下:

怎么让四舍五入都不亏?(怎么四舍五入到个位)

  1. 舍去位的数值小于5时直接舍去

  2. 舍去位的数值大于6时,进位后舍去

  3. 当舍去位的数值等于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支持七种舍入方式:

  1. ROUND_UP:远离零方向舍入(也就是说向绝对值最大的方向舍入,只要舍弃位非零就进位,此时的-10.5和10.5的舍入值为-11和11)

  2. ROUND_DOWN:趋向零方向舍入(向0方向靠拢,所有位都舍去,不存在进位情况,此时的-10.5和10.5的舍入值为-10和10)

  3. ROUND_CEILING:向正无穷方向舍入(向正最大方向靠拢,这就是Math.round方法的模式了,此时的-10.5和10.5的舍入值为-10和11)

  4. ROUND_FLOOR:向负无穷方向舍入(如果是正数,则舍入行为类似于第二种,如果是负数,则舍入行为类似于第一种,此时的-10.5和10.5的舍入值为-11和10.)

  5. HALF_UP:这就是我们最经典的四舍五入(此时的-10.5和10.5的舍入值为-11和11)

  6. HALF_DOWN:最近数字舍入(5舍,在这个模式中四舍五入的时候5是不进位的,此时的-10.5和10.5的舍入值为-10和10)

  7. HALF_EVEN:银行家算法。

所以在我们普通的项目中舍入方式采用Math.round不会有太大影响,但是利息计算之类的复杂的业务逻辑的项目中,就要选择好近似的模式,尽量避免因为这个误差造成损失。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表