BigDecimal介绍

       双精度浮点型变量能够处理16位的有效数字。对于实际应用中更复杂精准的计算,则由java.math包类提供API类BigDecimal实现。

    BigDecimal是Java提供的一个不变的、任意精度的有符号十进制数对象。提供的方法如下:

序号

   

类型

   

1

public BigDecimal(double val)

构造

将double表示形式转换

为BigDecimal

2

public BigDecimal(int val)

构造

将int表示形式转换为

BigDecimal

3

public BigDecimal(String val)

构造

将字符串表示

形式转换为BigDecimal

4

public BigDecimal add(BigDecimal augend)

普通

加法

5

public BigDecimal subtract(BigDecimal
subtrahend)

普通

减法

6

public BigDecimal multiply(BigDecimal
multiplicand)

普通

乘法

7

public BigDecimal divide(BigDecimal
divisor)

普通

除法

 

          它提供了四个构造器,我们重点看用double和String构造的两个构造器(有关BigInteger详细介绍请查阅j2se API文档)。

BigDecimal(double val)

           Translates a double into a BigDecimal.

BigDecimal(String val)

           Translates the String representation of a BigDecimal into a BigDecimal.

BigDecimal(double)是把一个double类型十进制数构造为一个BigDecimal对象实例。

BigDecimal(String)是把一个以String表示的BigDecimal对象构造为BigDecimal对象实例。

习惯上,对于浮点数我们都会定义为double或float,但BigDecimal API文档中对于BigDecimal(double)有这么一段话:

  1. /*The results of this constructor can be somewhat unpredictable. One might assume that  
  2. new BigDecimal(0.1) is exactly equal to 0.1, but it is actually equal  
  3. to .1000000000000000055511151231257827021181583404541015625. This is so because 0.1  
  4. cannot be represented exactly as a double (or, for that matter, as a binary fraction  
  5. of any finite length). Thus, the long value that is being passed in to the constructor  
  6. is not exactly equal to 0.1, appearances nonwithstanding. 
  7. The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal 
  8. ("0.1") is exactly equal to0 .1, as one would expect. Therefore, it is generally  
  9. recommended that the (String) constructor be used in preference to this one.*/  

下面对这段话做简单解释:

注意:这个构造器的结果可能会有不可预知的结果。

有人可能设想new BigDecimal(0.1)等于0.1是正确的,但它实际上是等于0.1000000000000000055511151231257827021181583404541015625,这就是为什么.1不能用一个double精确表示的原因,因此,这个被放进构造器中的长值并不精确的等于0.1,尽管外观看起来是相等的。

然而(String)构造器,则完全可预知的,new BigDecimal(“0.1”)如同期望的那样精确的等于0.1,因此,(String)构造器是被优先推荐使用的。

 

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

     

    看下面的结果:

         System.out.println(new BigDecimal(123456789.02).toString());

          System.out.println(new BigDecimal("123456789.02").toString());

    输出为:

    123456789.01999999582767486572265625

    123456789.02

    现在我们知道,如果需要精确计算,非要用String来够造BigDecimal不可!

    实现方案

    现在我们已经知道怎么解决这个问题了,原则上是使用BigDecimal(String)构造器,我们建议,在商业应用开发中,涉及金额等浮点数计算的数据,全部定义为String,数据库中可定义为字符型字段,在需要使用这些数据进行运算的时候,使用BigDecimal(String)构造BigDecimal对象进行运算,保证数据的精确计算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值