搜索
您的当前位置:首页正文

浅谈BigDecimal

来源:筏尚旅游网

看图

读过effective java的都知道,其中第49条就是:如果需要精确的答案,请避免使用float和double

所以在涉及到货币计算的时候一般使用BigDecimal

分析

BigDecimal.valueof(0.99),可以看一下此方法的具体实现:

可以看到此方法先将参数转成了string类型,然后在执行参数为String类型的BigDecimal的构造函数。这样的结果一般就是我们想要的。
所以在使用BigDecimal的时候,要么使用newBigDecimal(String value),要么使用BigDecimal.valueof(doublevalue)。

那如果参数为float类型的,比如BigDecimal.valueOf(0.99f)的值是多少呢?
首先此函数会自动进行精度扩展,将float类型的0.99转成double类型的,因为0.99本身就是无法用二进制表示的,也就说无论你的精度是多少位,都无法用二进制来精确表示0.99,或者你用二乘来判断(0.992=1.98 0.982=1.960.96*2=1.92 。。。永远无法得到一个整数)。这就是二进制计算机的缺点,就如同十进制也也无法表示1/3,1/6一样。
所以在0.99f转成double时,进行了精度扩展,变成了0.9900000095367432,而接着转成字符串,最后转成BigDecimal.

jdk中已经明确不建议使用new BigDecimal(double value)这种形式的构造函数,这是为什么呢???
仍然是因为double类型不够精确,

总结:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top