Effective Java Second Edition 第48条 如果需要精确的答案,请避免使用float和double。
1.简介
float和double类型主要是为了科学计算与工程计算而设计的,它们并没有提供完全精确的结果,所以不应该被用于需要精确结果的场合。在商业计算中要用BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
2.构造器描述
- BigDecimal(int) 创建一个具有参数所指定整数值的对象
- BigDecimal(double) 创建一个具有参数所指定双精度值的对象
- BigDecimal(long) 创建一个具有参数所指定长整数值的对象
- BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象
3.方法描述
- add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象
- subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象
- multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象
- divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象
- toString() 将BigDecimal对象的数值转换成字符串
- doubleValue() 将BigDecimal对象中的值以双精度数返回
- floatValue() 将BigDecimal对象中的值以单精度数返回
- longValue() 将BigDecimal对象中的值以长整数返回
- intValue() 将BigDecimal对象中的值以整数返回
4.BigDecimal比较
BigDecimal是通过使用compareTo(BigDecimal)来比较的,具体比较情况如下:
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("2");
BigDecimal c = new BigDecimal("1");
int result1 = a.compareTo(b);
int result2 = a.compareTo(c);
int result3 = b.compareTo(a);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
打印结果是:-1、0、1,即左边比右边数大,返回1,相等返回0,比右边小返回-1。
注意不能使用equals方法来比较大小。
5.BigDecimal缺点
使用BigDecimal的坏处是
- 与使用基本运算类型想比,这样做很不方便
- 性能比double和float差,在处理庞大,复杂的运算时尤为明显。
因根据实际需求决定使用哪种类型。