Float或Double浮点型计算导致小数点后面显示过长数据的解决方法

本文探讨了Java中使用float和double进行计算时可能出现的精度问题,并推荐使用BigDecimal进行精确计算。详细解释了BigDecimal的构造方法,特别是使用double构造可能导致的不准确性。提出了解决方案,即通过String构造BigDecimal来进行精确运算,并提供了一个名为Arith的工具类,简化了浮点数的加减乘除和四舍五入操作。
摘要由CSDN通过智能技术生成

BigDecimal  
  在《Effective   Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个, 它们是:  
  BigDecimal(double   val)    
                      Translates   a   double   into   a   BigDecimal.    
  BigDecimal(String   val)    
                      Translates   the   String   repre   sentation   of   a   BigDecimal   into   a   BigDecimal.  
   
  上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才 发现上面哪个够造方法的详细说明中有这么一段:  
  Note:   the   results   of   this   constructor   can   be   somewhat   unpredictable.   One   might   assume   that   new   BigDecimal(.1)   is   exactly   equal   to   .1,   but   it   is   actually   equal   to   .1000000000000000055511151231257827021181583404541015625.   This   is   so   because   .1   cannot   be   represented   exactly   as   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,   on   the   other   hand,   is   perfectly   predictable:   new   BigDecimal(".1")   is   exactly   equal   to   .1,   as   one   would   expect.   Therefo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值