我必须计算一些浮点变量,我的同事建议我使用BigDecimal
而不是double
,因为它会更精确。但是我想知道它是什么,以及如何最大限度地利用BigDecimal
发布于 2010-08-05 17:45:13
BigDecimal
是一种精确的数字表示方式。Double
具有一定的精度。使用不同幅度的倍增(例如d1=1000.0
和d2=0.001
)可能会导致0.001
在求和时一起下降,因为幅度的差异如此之大。如果使用BigDecimal
,这种情况就不会发生。
BigDecimal
的缺点是速度较慢,而且以这种方式编写算法会有点困难(因为+
-
*
和/
没有过载)。
如果你和钱打交道,或者精确度是必须的,那就使用BigDecimal
。否则,Doubles
往往就足够好了。
我确实推荐阅读BigDecimal
的javadoc,因为它们比我在这里更好地解释了事情:)
发布于 2016-05-14 03:10:19
我的英语不好,所以我在这里只写一个简单的例子。
double a = 0.02;
double b = 0.03;
double c = b - a;
System.out.println(c);
BigDecimal _a = new BigDecimal("0.02");
BigDecimal _b = new BigDecimal("0.03");
BigDecimal _c = _b.subtract(_a);
System.out.println(_c);
程序输出:
0.009999999999999998
0.01
还有人想用double吗?;)
发布于 2016-05-28 23:28:44
如果你写一个像1 / 7
这样的小数值作为十进制值,你会得到
1/7 = 0.142857142857142857142857142857142857142857...
具有无限序列的142857
。由于您只能写入有限数量的数字,因此不可避免地会引入舍入(或截断)错误。
像1/10
或1/100
这样的用带小数部分的二进制数表示的数字在小数点后也有无限位数:
1/10 = binary 0.0001100110011001100110011001100110...
Doubles
将值存储为二进制,因此可能仅通过将十进制数转换为二进制数而引入错误,甚至不进行任何算术。
另一方面,十进制数字(如BigDecimal
)按原样存储每个十进制数字(二进制编码,但每个十进制数字都是独立的)。这意味着在一般意义上,decimal类型并不比二进制浮点或定点类型更精确(即,它无法在不损失精度的情况下存储1/7
),但对于小数位数有限的数字来说,它更准确,这通常是货币计算的情况。
Java的BigDecimal
有一个额外的优点,它可以在小数点两侧有任意(但有限的)位数,只受可用内存的限制。
https://stackoverflow.com/questions/3413448
复制相似问题