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,也可以使用String的static方法: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
相关推荐
- 类、接口和方法应有清晰的Javadoc注释,解释其功能、用途和使用注意事项。 - 单行注释尽量避免在代码行的前面,而应使用`//`放在代码行的后面。 - 注释要保持更新,与代码同步,避免出现“死注释”。 3. **...
例如,当遇到错误或需要扩展功能时,可以查找相应的类或方法,查看其使用示例和注意事项。 在Java SE 6版本中,还有一些重要的更新和改进,例如增强的泛型支持、并发工具的改进、动态代理的增强以及新的Swing组件等...
7. **特殊类型注意事项**:Java不支持C/C++中的指针、结构体、枚举和联合类型。其中,short类型由于字节顺序问题在某些平台可能引发问题,因此使用较少。默认的整数类型是int,长整型需后缀“l”或“L”,浮点数默认...
【代码质量与常见问题总结】 ...通过以上所述的注意事项和工具应用,开发者可以显著提升代码质量,减少潜在的bug,同时提高代码的可读性和可维护性。对于任何项目而言,良好的代码质量都是软件成功的关键。
7. **文档**:`readme.txt`文件可能包含了项目的说明、使用指南或开发者注意事项,对于用户和贡献者来说是重要的参考。 总的来说,"JAVA多功能科学计算器"项目是一个综合性的实践,涵盖了Java GUI编程、事件处理、...
例如,方法的重载是指同一类中方法名相同但参数列表不同的方法,而多态的注意事项包括某些方法不能被重写,如final方法和实例方法不能与static方法重写。 总之,JavaSE的学习是一个系统的过程,涵盖了大量的概念和...
4. 注意事项:提醒用户关于代码中的特定实现细节,例如使用`BigDecimal`的原因和小数位数的设定。 5. 示例:展示一个实际的运行示例,包括输入和输出结果。 通过这个项目,开发者可以学习到Java中的数学运算、...
3. `README.txt`文件可能包含了实验的具体要求、步骤、注意事项以及预期的结果,帮助读者更好地理解代码实现。 总结,Java代码-实验报告Money是一个学习和实践面向对象编程、金融计算精度控制以及良好编程习惯的好...
- **小技巧和注意事项**:分享在处理关联时的一些实用技巧和需要注意的地方。 - **关联详解**:深入探讨每种关联类型的实现细节。 - **单表继承**:介绍如何使用单表继承来实现多态关联。 #### ActiveRecord查询...
1.15 课程中使用的5个表:在学习过程中,会涉及到具体的表结构和数据来实践SQL语句。 2.1 select语句功能:select语句用于从数据库中检索数据。 2.2 select语句基本语法:SQL语句包括select、from、where等子句。 ...
### 实践应用与注意事项 - **BLOB类型**:用于存储图像、音频、视频等非结构化数据时非常有用,但需要注意性能问题,大量读写BLOB数据可能会影响数据库的响应速度。 - **BOOLEAN类型**:尽管MySQL中使用TINYINT来...
**注意事项:** - CQRS可能导致数据的暂时不一致性问题,因为读取的数据可能不是最新的。 - 可能需要额外的工作来同步数据,例如使用事件溯源(Event Sourcing)。 #### 实体与值对象 **定义:** - **实体(Entity)**...