Java 可不是小事! ! ! ! ! ! ! ! ! ! ! !
四舍五入是我们小学的一道数学题。对于我们程序员来说,这个问题就像从1到10的加减乘除一样简单。在解释之前,我们先来看看下面的经典案例:
public static void main(String[] args) { System.out.println("12.5的四舍五入值:" + Math.round(12.5)); System.out.println("-12.5的四舍五入值:" + Math.round(-12.5)); } Output: 12.5的四舍五入值:13 -12.5的四舍五入值:-12
这是一个四舍五入的经典案例,也是我们参加校招时经常遇到的事情(好像参加笔试时遇到过很多次)。从这个结果我们发现这两个数字具有相同的绝对值,为什么近似值不同?事实上,这是由 Math.round 使用的舍入规则决定的。
四舍五入实际上在金融中被大量使用,尤其是银行利息。我们都知道,银行的主要盈利渠道是息差。它从储户那里收集资金,然后将其借出。期间产生的利息差额为银行获得的利润。如果我们使用通常的取整规则,这里我们以每 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后还有其他非零值,则四舍五入后进行四舍五入。进位,四舍五入。
以上规则我们用一个例子来说明
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_UPjs小数点保留2位四舍五入,对于负数js小数点保留2位四舍五入,舍入行为类似于 ROUND_DOWN。 Math.round() 方法使用这种模式。
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 和四舍五入非常匹配。
方法二:
java.text.DecimalFormat df =new java.text.DecimalFormat(”#.00″); df.format(你要格式化的数字);
示例:new java.text.DecimalFormat(“#.00”).format(3.1415922、0@>
#.00 表示小数点后两位 #.0000 小数点后四位以此类推…
方法三:
2、1@>
方法四:
另外,如果struts标签用于输出,还有一个format属性,设置为format=”0.00″保留两位小数
例子:
2、3@>
不迈出一小步,就走不了千里
没有小溪的积累,就无法造出河流或海洋。
——荀子的“励学”
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网