`
kingxss
  • 浏览: 973340 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BigDecimal使用实践和注意事项

阅读更多

BigDecimal简介

   JDK文档(中文)中的解释如下:

   不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)

 

具体解释

    1.“BigDecimal 对象的值是不可变的”。这点在BigDecimal 对象的运算函数中表现了该特性:

BigDecimal a = new BigDecimal("1.22");
System.out.println("construct with a String value: " + a);
BigDecimal b = new BigDecimal("2.22");
a.add(b);
System.out.println("a plus b is : " + a);

        我们很容易会认为会输出:

       construct with a Stringvalue:  1.22

       a plus b is :3.44

       但实际上a plus b is : 1.22

 

    2.“BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果标度值为零或正数,则标度是小数点后的位数”。这句话可以这样看:

   例如:-12 和 13.412

   表示为:-12 × 10-0 和13412 × 10-3

       这里用(非标度值 和 标度)表示分别为:[-12, 0]和[13412, 3]

 

    3.“如果标度值为负数,则将该数的非标度值乘以 10 的负 scale 次幂”。这句话可以这样看:

   例如:120.00

   该值表示为:12000 × 10-2

   这里用(非标度值 和 标度)表示分别为:[12000, 2]

  

  这里标度的值依然为正数2,但是进行进行下面操作:

BigDecimal amount = new BigDecimal("-120.00");
//返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal。
amount = amount.stripTrailingZeros();

   该值表示为:12 × 10-(-1)

 

   这里用(非标度值 和 标度)表示分别为:[12, -1]

 

使用注意事项

    1.构造函数

BigDecimal aDouble =new BigDecimal(1.22);
System.out.println("construct with a double value: " + aDouble);
BigDecimal aString = new BigDecimal("1.22");
System.out.println("construct with a String value: " + aString);

 

 输出结果如下:

 construct with a doublevalue:1.2199999999999999733546474089962430298328399658203125

 construct with a String value: 1.22

 

JDK的描述:

a)参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

b)另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法

c)当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法。将double转换为String,也可以使用Stringstatic方法:String.valueOf(double)

 

    2.运算操作。加减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b); 

 

例子:

判定BigDecimal 对象是否为整数:

private boolean isIntegerValue(BigDecimal bd) {
  return bd.signum() == 0 || bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
}

为什么要这样做,请测试下下面这个例子:

 

BigDecimal amount = new BigDecimal("-120.00");//请分别尝试"0", "0.00", "1.00","10.00"和"10.10"
System.out.println(amount.signum());//正负
System.out.println(amount.scale()); //标度
System.out.println(amount.stripTrailingZeros().scale());//去零后的标度

 

 

 

参考:

1.《BigDecimal详解》: http://blog.csdn.net/jackiehff/article/details/8582449

2. http://stackoverflow.com/questions/1078953/check-if-bigdecimal-is-integer-value

分享到:
评论

相关推荐

    阿里java开发规范

    - 类、接口和方法应有清晰的Javadoc注释,解释其功能、用途和使用注意事项。 - 单行注释尽量避免在代码行的前面,而应使用`//`放在代码行的后面。 - 注释要保持更新,与代码同步,避免出现“死注释”。 3. **...

    java API (JDK_API_1_6_zh_CN_1)

    例如,当遇到错误或需要扩展功能时,可以查找相应的类或方法,查看其使用示例和注意事项。 在Java SE 6版本中,还有一些重要的更新和改进,例如增强的泛型支持、并发工具的改进、动态代理的增强以及新的Swing组件等...

    Java基础课程培训PPT教案学习.pptx

    7. **特殊类型注意事项**:Java不支持C/C++中的指针、结构体、枚举和联合类型。其中,short类型由于字节顺序问题在某些平台可能引发问题,因此使用较少。默认的整数类型是int,长整型需后缀“l”或“L”,浮点数默认...

    代码质量与常见问题总结.pptx

    【代码质量与常见问题总结】 ...通过以上所述的注意事项和工具应用,开发者可以显著提升代码质量,减少潜在的bug,同时提高代码的可读性和可维护性。对于任何项目而言,良好的代码质量都是软件成功的关键。

    JAVA多功能科学计算器

    7. **文档**:`readme.txt`文件可能包含了项目的说明、使用指南或开发者注意事项,对于用户和贡献者来说是重要的参考。 总的来说,"JAVA多功能科学计算器"项目是一个综合性的实践,涵盖了Java GUI编程、事件处理、...

    JavaSE基础学习笔记

    例如,方法的重载是指同一类中方法名相同但参数列表不同的方法,而多态的注意事项包括某些方法不能被重写,如final方法和实例方法不能与static方法重写。 总之,JavaSE的学习是一个系统的过程,涵盖了大量的概念和...

    java代码-计算圆的面积,保留5位小数

    4. 注意事项:提醒用户关于代码中的特定实现细节,例如使用`BigDecimal`的原因和小数位数的设定。 5. 示例:展示一个实际的运行示例,包括输入和输出结果。 通过这个项目,开发者可以学习到Java中的数学运算、...

    java代码-实验报告Money

    3. `README.txt`文件可能包含了实验的具体要求、步骤、注意事项以及预期的结果,帮助读者更好地理解代码实现。 总结,Java代码-实验报告Money是一个学习和实践面向对象编程、金融计算精度控制以及良好编程习惯的好...

    Ruby on Rails 指南 v5.0.1 中文版

    - **小技巧和注意事项**:分享在处理关联时的一些实用技巧和需要注意的地方。 - **关联详解**:深入探讨每种关联类型的实现细节。 - **单表继承**:介绍如何使用单表继承来实现多态关联。 #### ActiveRecord查询...

    java 讲师笔记

    1.15 课程中使用的5个表:在学习过程中,会涉及到具体的表结构和数据来实践SQL语句。 2.1 select语句功能:select语句用于从数据库中检索数据。 2.2 select语句基本语法:SQL语句包括select、from、where等子句。 ...

    java_mysql_数据类型对照.doc

    ### 实践应用与注意事项 - **BLOB类型**:用于存储图像、音频、视频等非结构化数据时非常有用,但需要注意性能问题,大量读写BLOB数据可能会影响数据库的响应速度。 - **BOOLEAN类型**:尽管MySQL中使用TINYINT来...

    Domain-Driven-Design-StepbyStep

    **注意事项:** - CQRS可能导致数据的暂时不一致性问题,因为读取的数据可能不是最新的。 - 可能需要额外的工作来同步数据,例如使用事件溯源(Event Sourcing)。 #### 实体与值对象 **定义:** - **实体(Entity)**...

Global site tag (gtag.js) - Google Analytics