【发布时间】:2013-11-14 13:00:30
【问题描述】:
我知道这个问题已经讨论过好几次了,但我对答案并不完全满意。请不要回复“双精度数不准确,不能表示 0.1!必须使用 BigDecimal”...
基本上我在做一个财务软件,我们需要在内存中存储很多价格。 BigDecimal 太大而无法放入缓存中,因此我们决定切换到 double。 到目前为止,我们没有遇到任何错误,这是有充分理由的,我们需要 12 位的准确度。 12 位数的估计是基于这样一个事实,即使我们以百万计,我们仍然能够处理美分。
double 给出 15 位有效十进制数字的精度。如果在必须显示/比较双打时将其四舍五入,会出现什么问题??
我猜问题是不准确的累积,但它有多糟糕?在影响第 12 位之前需要进行多少次操作?
你发现双打还有其他问题吗?
编辑:大约很长,这绝对是我们考虑过的事情。我们正在做很多除法乘法,而 long 不能很好地处理(丢失小数和溢出),或者至少你必须非常小心你所做的事情。我的问题更多是关于双打的理论,基本上它有多糟糕,不准确是否可以接受?
EDIT2:不要试图解决我的软件问题,我可以接受不准确 :)。我重新提出问题:如果您只需要 12 位数字并且在显示/比较时舍入双精度数,那么发生不准确的可能性有多大?
【问题讨论】:
-
你不能只存储全部的美分吗?
-
@tibo 这就是我所说的 - “你的方法的内存复杂性有问题”。即使你保存了这 24 个字节,当你有 4000 万而不是 10 个价格时,它仍然会爆炸......
-
关于双打是“坏”的,见my answer;基本上双打并不比我们自己的十进制系统差(尝试用十进制表示 1/3)。这两个系统只是具有他们“喜欢”的不同数字。在这种情况下,您应该考虑双打。金融系统特别喜欢 1/100,它恰好可以用十进制精确表示,但不能用二进制表示
-
这有点像 hack,但如果你必须必须使用双精度数,那么每次操作都会四舍五入到 2 位有效数字会抑制错误的累积
-
问题“在影响第 12 位之前需要进行多少次操作?”没有其他信息就无法回答,特别是要执行哪些操作以及使用什么值,特别是因为问题提到了除法和乘法,而不仅仅是加减金钱。
标签: java floating-point double bigdecimal ieee-754