有关JAVA BigDecimal的使用
来源:互联网 发布:mysql注释 编辑:程序博客网 时间:2024/05/19 06:49
先看段官方文档
/*The results of thisconstructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactlyequal to .1, but it is actually equal to.1000000000000000055511151231257827021181583404541015625. This is so because.1 cannot be represented exactlyas a double (or, for that matter, as a binary fraction of any finite length). Thus,the long value that is being passed in to the constructor is not exactly equal to .1,appearances nonwithstanding.The (String) constructor, onthe other hand, is perfectly predictable: new BigDecimal(".1") is exactlyequal to .1, as one would expect. Therefore, it is generally recommended that the (String)constructor be used in preference to this one.*/
也就是说利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。
BigDecimal b = newBigDecimal("0.3"); //BigDecimal b = new BigDecimal(0.3); System.out.println(b.multiply(BigDecimal.valueOf(100))); System.out.println(b.floatValue()*100); System.out.println(b.multiply(BigDecimal.valueOf(100)).setScale(0,BigDecimal.ROUND_HALF_UP));
关于setScale函数的:
setScale(1)表示保留以为小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)五舍六入,2.35变成2.3,2.36变成2.40 如果是5则向下舍
关于类型转换:
BigDecimal类提供了诸如intValue(),floatValue(), doubleValue(), longValue()方法来将BigDecimal对象转换成对应的值
还提供了valueOf() 来将float,double类型转换为BigDecimal
网上总结:
1、此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
2、另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。
3、当 double 必须用作BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。
补充:
1、BigDecimal 计算时由于除法运算,得到循环结果,造成异常!
BigDecimal total = new BigDecimal(200).setScale(3, BigDecimal.ROUND_HALF_UP);
表示这个total的初始值为200.000
BigDecimal total2 = new BigDecimal(10).setScale(3, BigDecimal.ROUND_HALF_UP);
表示这个total2的初始值为10.000
当这个2数相除的时候不能简单的用total.divide(total2);
如果这样会报错:
Non-terminating decimal expansion; no exact representable decimal result
正确的方法:
total.divide(total2,3,BigDecimal.ROUND_HALF_UP);
这样才不会报错,你必须为它保留小数位
- 有关JAVA BigDecimal的使用
- 有关JAVA BigDecimal的使用
- java BigDecimal的使用
- Java中的BigDecimal的使用
- [Java 类库]BigDecimal 的使用
- java中BigDecimal的使用
- Java中BigDecimal的使用
- java中BigDecimal的使用
- Java基础-BigDecimal的使用
- Java中BigDecimal的使用
- [Java] 整理的有关BigDecimal工具类分享
- Java中的java.math.BigDecimal的使用
- 使用java.math.BigDecimal
- Java BigDecimal使用
- 使用java.math.BigDecimal
- 【java】BigDecimal使用注意
- BigDecimal的使用
- BigDecimal 的使用
- jstl中的<fmt:formatNumber>标签type属性
- vim tips
- 《C++primer》读书笔记一 类
- 说说.NET中忽视的方法
- Ubuntu下搭建Ruby on Rails+MongoDB+Redis环境
- 有关JAVA BigDecimal的使用
- 国际空间站4月30日将首次迎接私企宇宙飞船
- 第十二周实验报告二
- 开源搜索引擎
- 第十二周任务一
- 康托展开
- ★【二分图匹配】【博弈论】【NOI2011】兔兔和蛋蛋的游戏
- 5月8日实验报告(一)理解基类成员的访问限定符和派生类的继承方式
- php开发框架