我知道BigDecimal是用于在Java中表示货币价值的推荐最佳实践.你用什么?您是否更喜欢使用更好的库?
有没有用于进行双重比较的java库?例如
public static boolean greaterThanOrEqual(double a, double b, double epsilon){
return a - b > -epsilon;
}
Run Code Online (Sandbox Code Playgroud)
我开始的每个项目我最终都会重新实现这个并复制粘贴代码和测试.
NB为什么更好地使用第三方JAR的一个很好的例子是IBM推荐以下内容:
"如果您不知道基础测量的规模,使用测试"abs(a/b - 1)<epsilon"可能比仅仅比较差异更加稳健"
我怀疑很多人会想到这一点,并说明即使是简单的代码也可能是次优的.
考虑到:
看起来像当前形式的Float.equals几乎完全没用.
我是否遗漏了某些东西,或者有时候使用Float.equals是合适的,除非你想要测试二进制相等的极其罕见的情况?
如果是这样,滚动你自己的identikit epsilon函数(如第一个链接中所推荐的那样)是否真的是完成的事情,或者是否存在这个令人难以置信的常见操作的现有包装器?
另外,Double/Float.compare是否会遇到同样的问题,或者是否存在需要epsilon的现有比较器?
(请注意,我无法将现有库从Floats更改为BigD)
我知道这个问题已经多次讨论过,但我对答案并不完全满意.请不要回答"双打不准确,你不能代表0.1!你必须使用BigDecimal"......
基本上我正在做一个财务软件,我们需要在内存中存储很多价格.BigDecimal太大了,无法容纳缓存,因此我们决定切换到double.到目前为止,我们没有因为正当理由而遇到任何错误,我们需要12位数的准确度.12位数的估计基于这样一个事实:即使我们以百万谈话,我们仍然能够处理美分.
double给出15位有效十进制数字精度.如果你在显示/比较它们时绕过你的双打,会出现什么问题?
我猜问题是不准确的积累,但有多糟糕呢?在它影响第12位之前需要多少次操作?
你看到双打的其他问题吗?
编辑:关于很久,这绝对是我们所想到的.我们正在做很多除法乘法,长期不会很好地处理(丢失小数和溢出),或者至少你必须非常小心你所做的.我的问题更多的是关于双打理论,基本上有多糟糕,是否可以接受不准确?
编辑2:不要试图解决我的软件,我不准确:).我重新提出这样一个问题:如果你只需要12个数字并且在显示/比较时你是否会翻倍,那么不准确的可能性有多大?