您的位置:首页 > 其它

BigDecimal的用法简介

2015-10-29 06:59 232 查看
在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍。float是4个字节而double是8个字节。float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算。大家可以通过下面代码可以看出来:

1

2

3

4

5

6

7

8

9

10

public
class
Test

{

    public
static
void
main(String[]
args)

    {

    System.out.println(0.05
+
0.01);

    System.out.println(1.0
-
0.42);

    System.out.println(4.015
*
100);

    System.out.println(123.3
/
100);

    }

}

运行的结果为:

0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

要想获得理想的结果,我们可以考虑使用BigDecimal来获得更精确的计算:

BigDecimal提供了多个构造函数,和浮点数有关的有:

BigDecimal(double val)  Translates a double into a BigDecimal.

BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal.

但是用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。

例如:

BigDecimal data1=new BigDecimal(0.05);

System.out.println(data1.toString());

BigDecimal data2=new BigDecimal("0.05");

System.out.println(data2.toString());

得到结果:

0.05000000000000000277555756156289135105907917022705078125

0.05

所以,我们最终需要使用String来创建对象,这样得到的结果才是最精确的。另外,如果是double数,我们还可以使用:BigDecimal.valueOf(double val),原因很简单,其JDK源码如下所示:

1

2

3

4

public
static
BigDecimal
valueOf(double
val)

{

    return
new
BigDecimal(Double.toString(val));

}

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

声明: 本文由金丝燕网原创编译,转载请保留链接: BigDecimal的用法简介
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BigDecimal 货币计算