在Java中,float和double都表示浮点型数,所表示的浮点数是近似值,而不是精确的值,所以,这两种数据类型不适合作为价格的数据类型。Java语言提供另外一种数据类型BigDecimal,可以用来表示精确的浮点数。
package com.zhhvip; import java.math.BigDecimal; public class Test { public static void main(String[] args) { double d1 = 20.15; double d2 = 10.10; System.out.println("double类型的运行结果:"+(d1-d2)); BigDecimal bigDecimal1 = BigDecimal.valueOf(d1); BigDecimal bigDecimal2 = BigDecimal.valueOf(d2); System.out.println("BigDecimal类型的运行结果:"+(bigDecimal1.subtract(bigDecimal2))); // 错误的使用方式 BigDecimal bigDecimal3 = new BigDecimal(d1); BigDecimal bigDecimal4 = new BigDecimal(d2); System.out.println("BigDecimal类型错误使用方式的运行结果:"+(bigDecimal3.subtract(bigDecimal4))); // 正确的使用方式 BigDecimal bigDecimal5 = new BigDecimal("20.15"); BigDecimal bigDecimal6 = new BigDecimal("10.10"); System.out.println("BigDecimal类型正确使用方式的运行结果:"+(bigDecimal5.subtract(bigDecimal6))); } }
运行结果:
注意,new 一个BigDecimal时候,只有参数为String类型时候才能够正确表示,为什么BigDecimal.valueOf()又可以呢?因为BigDecimal.valueOf()本质上也是调用了参数类型为String的构造方法。
public static BigDecimal valueOf(double val) { // Reminder: a zero double returns '0.0', so we cannot fastpath // to use the constant ZERO. This might be important enough to // justify a factory approach, a cache, or a few private // constants, later. return new BigDecimal(Double.toString(val)); }