对于不需要任何精确计算精度的数字,可以直接使用float或者double,但是如果需要精确的计算结果,就必须使用BigDecimal类,也可以使用BigDecimal类来操作大数。下面这篇文章介绍Java中BigDecimal的加减乘除,大小比较,使用注意事项。有需要的朋友可以参考一下。
前言
借用《Effactive Java》这本书的话,浮子和双型的主要设计目标是为了科学计算和工程计算。它们执行二进制浮点运算,这种运算经过精心设计,可以在很大范围的数值上提供精确而快速的近似计算。但是,它们不能提供完全准确的结果,因此不应在需要准确结果的场合使用。然而,商业计算通常需要精确的结果。在java中,int的最大值是:2147483647。如果你想用一个比这个大的数字呢?换句话说,值很大,所以此时使用BigDecimal。有很多关于BigDecimal的介绍。需要了解的朋友可以参考这篇文章:https://www.jb51.net/article/55395.htm.
一、BigDecimal 的加减乘除
BigDecimal big num 1=new BigDecimal(' 10 ');
BigDecimal big num 2=new BigDecimal(' 5 ');
BigDecimal bignum3=null
//加法
big num 3=big num 1 . add(big num 2);
system . out . println(' and yes:' big num 3 ');
//减法
big num 3=big num 1 . subtract(big num 2);
System.out.println('区别是:' big num 3 ');
//乘法
big num 3=big num 1 . multiply(big num 2);
System.out.println('产品为:' big num 3 ');
//除法
big num 3=big num 1 . divide(big num 2);
System.out.println('商为:' big num 3 ');
运行结果是:
二、BigDecimal 的比较大小。
BigDecimal num 1=new BigDecimal(' 0 ');
BigDecimal num 2=new BigDecimal(' 1 ');
BigDecimal num 3=new BigDecimal(' 2 ');
BigDecimal num=new BigDecimal(' 1 ');//用于比较的值
system . out . println(num 1 . compare to(num));//当小于时,返回-1
system . out . println(num 2 . compare to(num));//当等于时,返回0。
system . out . println(num 3 . compare to(num));//当大于时,返回1。
这是输出结果:
在笔记里解释一下。
补充:
BigInteger也可以存储大数,和BigDecimal的区别在于BigInteger存储大整数,BigDecimal存储大小数。
继续用BigDecimal写一个for循环。
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一样,它的所有操作都会生成一个新的对象,所以
amount . add(this amount);
是错误的;应该是:
amount=amount . add(this amount);
2. 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;
例如:
BigDecimal a=new BigDecimal(' 2.00 ');
BigDecimal b=new BigDecimal(' 2.0 ');
print(a .等于(b));//假
所以应该使用compareTo()和signum()方法。
a .比较(b);//返回(-1如果a b),(0如果a==b),(1如果a b)
a . signum();//返回(-1,如果a为0),(0,如果a==0),(1,如果a为0)
3. 使用BigDecimal的字符串构造函数,不要使用double参数的构造函数,否则的话会出现你不想要的结果。
比如下面的代码分别使用double和String的构造函数,然后使用HALF_EVEN的round方法,但是输出结果不同:
system . out . println('=================');
for(int I=0;i 10i ) {
string buffer sb=new string buffer();
某人追加(' 0。);
某人追加(一);
某人追加(' 5 ');
BigDecimal bdx=new BigDecimal(sb . tostring());
system . out . println(sb ' ' bdx . set scale(1,RoundingMode。半_偶数));
}
system . out . println('=================');
for(int I=0;i 10i ) {
string buffer sb=new string buffer();
某人追加(' 0。);
某人追加(一);
某人追加(' 5 ');
BigDecimal bdx=new BigDecimal(double . value of(sb . tostring()));
system . out . println(sb ' ' bdx . set scale(1,RoundingMode。半_偶数));
}
输出是:
==================
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
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。