一般来说,一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。
BigDecimal类位于java.maths类包下。首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,这里挑选最常用的两个来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String str)。这两个看上去没什么太大区别,但是正像API描述中说:
也就是说利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。请看下面的代码:
import java.math.*;
public class TestBigDecimal {
public static void main(String args[]){
BigDecimal bd = new BigDecimal( "10.123");
BigDecimal bd1 = new BigDecimal(10.123);
System.out.println(bd +"/n"+ bd1);
}
}
运行后输出:
10.123
10.1229999999999993320898283855058252811431884765625
所以我们在选择构造函数时,要看具体需求而定。
另外,很多人会问到怎么将基本类型,如int,float,double,long,和BigDecimal对象相互转换。很简单:
基本类型通过构造函数转换成对应的BigDecimal对象,而BigDecimal类提供了诸如intValue(), floatValue(), doublevalue(), longValue()方法来将BigDecimal对象转换成对应的值。
一、BigDecimal 的加减乘除
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);
二、BigDecimal 的比较大小。
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
补充:
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( thisAmount );
是错误的;而应该是:
amount = amount.add( thisAmount );
2. 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;
BigDecimal a = new BigDecimal("2.00");
BigDecimal b = new BigDecimal("2.0");
print(a.equals(b)); // false
所以你应该使用compareTo()和signum()方法
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方法,但是输出结果不一样
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));
}
输出是:
==================
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



