java BigDecimal.ROUND_UP和BigDecimal.ROUND_DOWN的用处
2015-09-15 10:13
656 查看
转载地址:http://taoer.com/2010/07/10/java-bigdecimal-round_up-round_down-useage/
今天在工作中遇到了这样的一个需求,
一个小数,例如1.7777777,或者1.3333333,不管后面的位数是多少,只保留到小数点后第二位,但是不是四舍五入,1.7777777处理后就是1.77,1.3333333处理后就是1.33
这个就要用到BigDecimal#setScale的方法了。
具体看如下代码:
?View
Code JAVA
输出结果如下:
1.67
1.66
1.34
1.33
1.00
1.00
————————————-
1.67
1.66
1.34
1.33
1.00
1.00
上面仅仅是根据我的需要举了BigDecimal.ROUND_UP和BigDecimal.ROUND_DOWN的例子,下面就用个表格来分析下。
ROUND_UP ROUND_DOWN
1.66728D 1.67 1.66
1.33333D 1.34 1.33
1.00000D 1.00 1.00
也就是说,ROUND_DOWN,是一个舍位取值的概念,我保留了两位小数,我不管你后面的小数值如何,也不会四舍五入,就硬生生的给阶段,相当于什么呢,就是我从小数点后面开始取两位,两位后面的都不要了,相当于一个截取字符串的操作。
而ROUND_UP那,很宽容,很大方,我不管你第三位的小数是多少,我都给你加一最小单位(比如保留两位小数,最小单位是0.01,保留三位小数,最小单位就是0.001),当然了,你保留到最后一位的数字如果是0的话,那么就不加了。
而这两个作用在咱们实际当中什么情况下不能使用四舍五入,需要用这两个呢?
用个应用题举例子吧,
一个篮子可以装10个苹果,现在有82个苹果,需要几个篮子来装?
9个,对,这是咱们的什么结果,不正是ROUND_UP的么(只不过这道题是取小数点后0位,也就是取整的区别而已),也就很好解释为什么最小单位是0不需要再加一个最小单位了,如果我只有80个苹果,8个篮子正好装下,就不需要第九个了。
那么什么时候儿需要使用ROUND_DOWN呢,再来看下面一个例子,
每个加油站相距8公里,一公里需要耗一个油,我现在车里还有90个油,请问,我最晚在第几个加油站必须得加油了?
11个,第十一个,就是在车使用88个油到达第11个加油站后需要加油,因为我还剩2个由已经撑不到第12个加油站了。这种情况,ROUND_DOWN就派上用场了。
其实,BigDecimal不光有ROUND_UP,ROUND_DOWN,还有其他的很多值,比如:ROUND_CEILING、ROUND_HALF_DOWN等等,具体的效果可以自己实验下
今天在工作中遇到了这样的一个需求,
一个小数,例如1.7777777,或者1.3333333,不管后面的位数是多少,只保留到小数点后第二位,但是不是四舍五入,1.7777777处理后就是1.77,1.3333333处理后就是1.33
这个就要用到BigDecimal#setScale的方法了。
具体看如下代码:
?View
Code JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.math.BigDecimal; import java.math.RoundingMode; public class ScaleTest { public static void main(String[] args) { double a = 1.66728D; double b = 1.33333D; double c = 1.00000D; BigDecimal aa = new BigDecimal(a); BigDecimal bb = new BigDecimal(b); BigDecimal cc = new BigDecimal(c); System.out.println(aa.setScale(2, BigDecimal.ROUND_UP)); System.out.println(aa.setScale(2, BigDecimal.ROUND_DOWN)); System.out.println(bb.setScale(2, BigDecimal.ROUND_UP)); System.out.println(bb.setScale(2, BigDecimal.ROUND_DOWN)); System.out.println(cc.setScale(2, BigDecimal.ROUND_UP)); System.out.println(cc.setScale(2, BigDecimal.ROUND_DOWN)); System.out.println("-------------------------------------"); System.out.println(aa.setScale(2, RoundingMode.UP)); System.out.println(aa.setScale(2, RoundingMode.DOWN)); System.out.println(bb.setScale(2, RoundingMode.UP)); System.out.println(bb.setScale(2, RoundingMode.DOWN)); System.out.println(cc.setScale(2, RoundingMode.UP)); System.out.println(cc.setScale(2, RoundingMode.DOWN)); } } |
1.67
1.66
1.34
1.33
1.00
1.00
————————————-
1.67
1.66
1.34
1.33
1.00
1.00
上面仅仅是根据我的需要举了BigDecimal.ROUND_UP和BigDecimal.ROUND_DOWN的例子,下面就用个表格来分析下。
ROUND_UP ROUND_DOWN
1.66728D 1.67 1.66
1.33333D 1.34 1.33
1.00000D 1.00 1.00
也就是说,ROUND_DOWN,是一个舍位取值的概念,我保留了两位小数,我不管你后面的小数值如何,也不会四舍五入,就硬生生的给阶段,相当于什么呢,就是我从小数点后面开始取两位,两位后面的都不要了,相当于一个截取字符串的操作。
而ROUND_UP那,很宽容,很大方,我不管你第三位的小数是多少,我都给你加一最小单位(比如保留两位小数,最小单位是0.01,保留三位小数,最小单位就是0.001),当然了,你保留到最后一位的数字如果是0的话,那么就不加了。
而这两个作用在咱们实际当中什么情况下不能使用四舍五入,需要用这两个呢?
用个应用题举例子吧,
一个篮子可以装10个苹果,现在有82个苹果,需要几个篮子来装?
9个,对,这是咱们的什么结果,不正是ROUND_UP的么(只不过这道题是取小数点后0位,也就是取整的区别而已),也就很好解释为什么最小单位是0不需要再加一个最小单位了,如果我只有80个苹果,8个篮子正好装下,就不需要第九个了。
那么什么时候儿需要使用ROUND_DOWN呢,再来看下面一个例子,
每个加油站相距8公里,一公里需要耗一个油,我现在车里还有90个油,请问,我最晚在第几个加油站必须得加油了?
11个,第十一个,就是在车使用88个油到达第11个加油站后需要加油,因为我还剩2个由已经撑不到第12个加油站了。这种情况,ROUND_DOWN就派上用场了。
其实,BigDecimal不光有ROUND_UP,ROUND_DOWN,还有其他的很多值,比如:ROUND_CEILING、ROUND_HALF_DOWN等等,具体的效果可以自己实验下
相关文章推荐
- myeclipse中加载JDK
- Java中接口和抽象类的区别你真的清楚吗?
- Mac下添加java环境变量
- Spring MVC Exception Handling Example
- java mail 发邮件完整实现
- struts2升级jar包遇到无法正常访问action的方法的问题
- javaweb学习笔记
- 【Java】PrettyTime
- Spring 3 MVC ContentNegotiatingViewResolver example
- spring cache 详解
- Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
- [转]spring 注入静态变量
- eclipse下java.lang.OutOfMemoryError:Java heap space
- Spring MVC + Log4j example
- 一个简答的java死锁
- javac不是内部命名
- 20个非常有用的Java程序片段
- Java关键字final、static使用总结
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Spring面试问答Top 25