服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - Java中BigDecimal的加减乘除、比较大小与使用注意事项

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

2021-02-04 11:32maytree_sun JAVA教程

对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减乘除、比较大小与使

前言

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

总结

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

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

延伸 · 阅读

精彩推荐
  • JAVA教程JAVA中 Spring定时器的两种实现方式

    JAVA中 Spring定时器的两种实现方式

    本文向您介绍Spring定时器的两种实现方式,包括Java Timer定时和Quartz定时器,两种Spring定时器的实现方式各有优点,可结合具体项目考虑是否采用。 ...

    mrr2092020-01-05
  • JAVA教程Java读取Map的两种方法与对比

    Java读取Map的两种方法与对比

    相信大家都知道在Java中Map的使用非常频繁,我们经常会需要对Map进行遍历和读取,那么下面这篇文章将展示两种遍历的方法以及简要分析。有需要的可以参...

    bladestone5002020-07-05
  • JAVA教程模拟Spring的简单实现

    模拟Spring的简单实现

    本文的主要内容就是学习Spring的开端,模拟一下Spring的实现,感兴趣的小伙伴可以参考一下 ...

    IT_xiao小巫4772020-01-09
  • JAVA教程java中volatile和synchronized的区别与联系

    java中volatile和synchronized的区别与联系

    这篇文章主要介绍了java中volatile和synchronized的区别与联系的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下...

    vtopqx10512021-01-21
  • JAVA教程Java中float类型的范围及其与十六进制的转换例子

    Java中float类型的范围及其与十六进制的转换例子

    这篇文章主要介绍了Java中float类型的范围及其与十六进制的转换例子,是Java入门学习中的基础知识,需要的朋友可以参考下 ...

    ISH_ICODE2422020-01-10
  • JAVA教程Java读取OpenSSL生成的PEM公钥文件操作

    Java读取OpenSSL生成的PEM公钥文件操作

    这篇文章主要介绍了Java读取OpenSSL生成的PEM公钥文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    此心光明-超然5522020-10-07
  • JAVA教程java NIO 详解

    java NIO 详解

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。 ...

    hebedich4742019-12-03
  • JAVA教程Java枚举使用方法详解

    Java枚举使用方法详解

    这篇文章主要为大家详细介绍了Java枚举的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    CSDN邓帅11112021-01-12