详解java的四舍五⼊与保留位⽰例
四舍五⼊是我们⼩学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了。在讲解之间我们先看如下⼀个经典的案例:
public static void main(String[] args) {
System.out.println("12.5的四舍五⼊值:" + und(12.5));
System.out.println("-12.5的四舍五⼊值:" + und(-12.5));
}
Output:
12.5的四舍五⼊值:13
-12.5的四舍五⼊值:-12
这是四舍五⼊的经典案例,也是我们参加校招时候经常会遇到的(貌似我参加笔试的时候遇到过好多次)。从这⼉结果中我们发现这两个绝对值相同的数字,为何近似值会不同呢?其实这与und采⽤
的四舍五⼊规则来决定。
四舍五⼊其实在⾦融⽅⾯运⽤的⾮常多,尤其是银⾏的利息。我们都知道银⾏的盈利渠道主要是利息差,它从储户⼿⾥收集资⾦,然后放贷出去,期间产⽣的利息差就是银⾏所获得的利润。如果我们采⽤平常四舍五⼊的规则话,这⾥采⽤每10笔存款利息计算作为模型,如下:
四舍:0.000、0.001、0.002、0.003、0.004。这些舍的都是银⾏赚的钱。
五⼊:0.005、0.006、0.007、0.008、0.009。这些⼊的都是银⾏亏的钱,分别为:0.005、0.004、.003、0.002、0.001。
所以对于银⾏来说它的盈利应该是0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005。从结果中可以看出每10笔的利息银⾏可能就会损失0.005元,千万别⼩看这个数字,这对于银⾏来说就是⼀笔⾮常⼤的损失。⾯对这个问题就产⽣了如下的银⾏家涉⼊法了。该算法是由美国银⾏家提出了,主要⽤于修正采⽤上⾯四舍五⼊规则⽽产⽣的误差。如下:
舍去位的数值⼩于5时,直接舍去。
舍去位的数值⼤于5时,进位后舍去。
当舍去位的数值等于5时,若5后⾯还有其他⾮0数值,则进位后舍去,若5后⾯是0时,则根据5前⼀位数的奇偶性来判断,奇数进位,偶数舍去。
对于上⾯的规则我们举例说明
11.556 = 11.56 ------六⼊
11.554 = 11.55 -----四舍
11.5551 = 11.56 -----五后有数进位
11.545 = 11.54 -----五后⽆数,若前位为偶数应舍去
11.555 = 11.56 -----五后⽆数,若前位为奇数应进位
下⾯实例是使⽤银⾏家舍⼊法:
public static void main(String[] args) {
BigDecimal d = new BigDecimal(100000); //存款
BigDecimal r = new BigDecimal(0.001875*3); //利息
BigDecimal i = d.multiply(r).setScale(2,RoundingMode.HALF_EVEN); //使⽤银⾏家算法
System.out.println("季利息是:"+i);
}
Output:
季利息是:562.50
在上⾯简单地介绍了银⾏家舍⼊法,⽬前Java⽀持7中舍⼊法:
1、 ROUND_UP:远离零⽅向舍⼊。向绝对值最⼤的⽅向舍⼊,只要舍弃位⾮0即进位。
2、 ROUND_DOWN:趋向零⽅向舍⼊。向绝对值最⼩的⽅向输⼊,所有的位都要舍弃,不存在进位情况。
3、 ROUND_CEILING:向正⽆穷⽅向舍⼊。向正最⼤⽅向靠拢。若是正数,舍⼊⾏为类似于ROUND_UP,若为负数,舍⼊
⾏为类似于ROUND_DOWN。und()⽅法就是使⽤的此模式。
4、 ROUND_FLOOR:向负⽆穷⽅向舍⼊。向负⽆穷⽅向靠拢。若是正数,舍⼊⾏为类似于ROUND_DOWN;若为负数,舍⼊⾏为类似于ROUND_UP。
5、 HALF_UP:最近数字舍⼊(5进)。这是我们最经典的四舍五⼊。
6、 HALF_DOWN:最近数字舍⼊(5舍)。在这⾥5是要舍弃的。
7、 HAIL_EVEN:银⾏家舍⼊法。
提到四舍五⼊那么保留位就必不可少了,在java运算中我们可以使⽤多种⽅式来实现保留位。
保留位
⽅法⼀:四舍五⼊
double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, RoundingMode.HALF_UP).doubleValue();
在这⾥使⽤BigDecimal ,并且采⽤setScale⽅法来设置精确度,同时使⽤RoundingMode.HALF_UP表⽰使⽤最近数字舍⼊法则来近似计算。在这⾥我们可以看出BigDecimal和四舍五⼊是绝妙的搭配。
⽅式⼆:
df.format(你要格式化的数字);
例:DecimalFormat(”#.00″).format(3.1415926)
#.00 表⽰两位⼩数 #.0000四位⼩数以此类推…
⽅式三:
double d = 3.1415926;
String result = String .format(”%.2f”);
bigdecimal除法保留小数%.2f %. 表⽰⼩数点前任意位数 2 表⽰两位⼩数格式后的结果为f 表⽰浮点型。
⽅式四:
此外如果使⽤struts标签做输出的话,有个format属性,设置为format="0.00"就是保留两位⼩数
例如:
<bean:write name="entity" property="dkhAFSumPl" format="0.00" />
//或者
<fmt:formatNumber type="number" value="${10000.22/100}" maxFractionDigits="0"/>
maxFractionDigits表⽰保留的位数
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论