Java中BigDecimal的加减乘除、比较大小与使用注意事项

2025-05-27 0 35

前言

借用《effactive java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了bigdecimal ,关于bigdecimal 的介绍有很多,需要了解的朋友可以参考这篇文章:https://www.zzvips.com/article/34898.html

一、bigdecimal 的加减乘除

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
bigdecimal bignum1 = new bigdecimal("10");

bigdecimal bignum2 = new bigdecimal("5");

bigdecimal bignum3 = null;

//加法

bignum3 = bignum1.add(bignum2);

system.out.println("和 是:" + bignum3);

//减法

bignum3 = bignum1.subtract(bignum2);

system.out.println("差 是:" + bignum3);

//乘法

bignum3 = bignum1.multiply(bignum2);

system.out.println("积 是:" + bignum3);

//除法

bignum3 = bignum1.divide(bignum2);

system.out.println("商 是:" + bignum3);

运行结果为:

Java中BigDecimal的加减乘除、比较大小与使用注意事项

二、bigdecimal 的比较大小。

?

1

2

3

4

5

6

7

8

9
bigdecimal num1 = new bigdecimal("0");

bigdecimal num2 = new bigdecimal("1");

bigdecimal num3 = new bigdecimal("2");

bigdecimal num = new bigdecimal("1"); //用做比较的值

system.out.println(num1.compareto(num)); //小于 时,返回 -1

system.out.println(num2.compareto(num)); //等于 时,返回 0

system.out.println(num3.compareto(num)); //大于 时,返回 1

这是输出结果:

Java中BigDecimal的加减乘除、比较大小与使用注意事项

解释下注释里面了。

补充:

biginteger 也可以存放比较大的数, 和 bigdecimal 的区别是 :biginteger 存放的是大的整数,而bigdecimal 存放大的小数

继续补充一下,用bigdecimal 写个for循环。

?

1

2

3
for (bigdecimal i = new bigdecimal("0"); i.compareto(new bigdecimal("10")) != 1; i = i.add(new bigdecimal("1"))) {

system.out.print(i + "\\t");

}

控制台打印的是从0 到 10 。

三、java中的bigdecimal使用注意事项

1.bigdecial是immutable的,就像string一样,它的所有操作都会生成一个新的对象,所以

?

1
amount.add( thisamount );

是错误的;而应该是:

?

1
amount = amount.add( thisamount );

2. 不要用equals方法来比较bigdecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;

例如:

?

1

2

3
bigdecimal a = new bigdecimal("2.00");

bigdecimal b = new bigdecimal("2.0");

print(a.equals(b)); // false

所以你应该使用compareto()和signum()方法

?

1

2
a.compareto(b); // returns (-1 if a < b), (0 if a == b), (1 if a > b)

a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)

3. 使用bigdecimal的字符串构造函数,不要使用double参数的构造函数,否则的话会出现你不想要的结果。

例如下面的代码分别使用double和string的构造函数,然后使用half_even的round方法,但是输出结果不一样:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
system.out.println("==================");

for(int i = 0; i < 10; i ++) {

stringbuffer sb = new stringbuffer();

sb.append("0.");

sb.append(i);

sb.append("5");

bigdecimal bdx = new bigdecimal(sb.tostring());

system.out.println(sb + " " +bdx.setscale(1, roundingmode.half_even));

}

system.out.println("==================");

for(int i = 0; i < 10; i ++) {

stringbuffer sb = new stringbuffer();

sb.append("0.");

sb.append(i);

sb.append("5");

bigdecimal bdx = new bigdecimal(double.valueof(sb.tostring()));

system.out.println(sb + " " +bdx.setscale(1, roundingmode.half_even));

}

输出是:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
==================

0.05 0.0

0.15 0.2

0.25 0.2

0.35 0.4

0.45 0.4

0.55 0.6

0.65 0.6

0.75 0.8

0.85 0.8

0.95 1.0

==================

0.05 0.1

0.15 0.1

0.25 0.2

0.35 0.3

0.45 0.5

0.55 0.6

0.65 0.7

0.75 0.8

0.85 0.8

0.95 0.9

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对快网idc的支持。

原文链接:http://blog.csdn.net/limingchuan123456789/article/details/12524495

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java中BigDecimal的加减乘除、比较大小与使用注意事项 https://www.kuaiidc.com/77469.html

相关文章

发表评论
暂无评论