本文共 2160 字,大约阅读时间需要 7 分钟。
我在看书时候偶然看到这个问题,我的第一反应:这还用问嘛!!!float和double都可以呀。(这充分说明了我是java初学者。。。)
不过,好学的我,还是想看看答案到底写了个啥。答案如下:
在初学Java的时候,我们知道float和double都表示浮点数。但是由于float和double所表示的浮点数是近似值,不是精确的值,因此,二者不适合作为价格的数据类型。Java语言提供了另外一种数据类型BigDecimal,可以表示精确的浮点数,适合用作财务计算的数据类型。但是需要注意的是,在使用BigDecimal的时候,BigDecimal有多个重载的构造方法能表示精度的值,只有用参数为String类型的构造方法才能表示。
看到此,我还是处于怀疑人生状态。。。
来个例子瞧瞧:
import java.math.BigDecimal;public class Test { public static void main(String[] args) { float d1 = 2.15f; float d2 = 1.10f; System.out.println("float类型运算结果:\n" + d1 + "-" + d2 + "=" + (d1 -d2) + "\n"); double d3 = 2.15; double d4 = 1.10; System.out.println("double类型运算结果:\n" + d3 + "-" + d4 + "=" + (d3 -d4) + "\n"); BigDecimal bd1 = new BigDecimal("2.15"); BigDecimal bd2 = new BigDecimal("1.10"); System.out.println("BigDecimal,参数为String类型运算结果:\n" + bd1 + "-" + bd2 + "=" + bd1.subtract(bd2) + "\n"); BigDecimal bd3 = new BigDecimal(2.15); BigDecimal bd4 = new BigDecimal(1.10); System.out.println("BigDecimal,参数为double类型时运算结果:\n" + bd3 + "-" + bd4 + "=" + bd3.subtract(bd4) + "\n"); }} float d2 = 1.10f; System.out.println("float类型运算结果:\n" + d1 + "-" + d2 + "=" + (d1 -d2) + "\n"); double d3 = 2.15; double d4 = 1.10; System.out.println("double类型运算结果:\n" + d3 + "-" + d4 + "=" + (d3 -d4) + "\n"); BigDecimal bd1 = new BigDecimal("2.15"); BigDecimal bd2 = new BigDecimal("1.10"); System.out.println("BigDecimal,参数为String类型运算结果:\n" + bd1 + "-" + bd2 + "=" + bd1.subtract(bd2) + "\n"); BigDecimal bd3 = new BigDecimal(2.15); BigDecimal bd4 = new BigDecimal(1.10); System.out.println("BigDecimal,参数为double类型时运算结果:\n" + bd3 + "-" + bd4 + "=" + bd3.subtract(bd4) + "\n"); }}
运行结果:
呀!!!还真是介个样纸!!!
对于BigDecimal(),
java.math.BigDecimal.BigDecimal(String val)
public BigDecimal(String val) { this(val.toCharArray(), 0, val.length()); }
public char[] toCharArray() { char result[] = new char[value.length]; System.arraycopy(value, 0, result, 0, value.length); return result; }
java.math.BigDecimal.BigDecimal(double val) 这个函数计算不精确的原因,恐怕还是double惹的祸吧
public BigDecimal(double val) { this(val,MathContext.UNLIMITED); }
哎!我还是赶紧把基本数据类型在内存中怎么存储的,好好学学吧!