Groovy数字比较问题

时间:2013-04-05 13:47:13

标签: java groovy

我试图从数据库中检索一些值,并在Groovy脚本中使用它们来查找和比较差异。

示例如下(当我在定义中使用浮点值时,在数据库中将它们定义为Number且精度为2),这是输出的外观

>

通常情况下,通过查看值,我希望两者之间的差异为16,但事实并非如此。

有关我会错过的任何建议吗?

1 个答案:

答案 0 :(得分:1)

当数字以NUMBER(x,2)或类似的类型存储在数据库中时,这意味着您将获得一个精确的数值,其中小数点后有2个位置。通过将这些转换为浮点数,您会引入错误(一个小而有界的错误,但是您已经发现了一个明显的错误),因为这些数字中没有一个确切的表示。转换为二进制时的某些数字是无限重复的,必须在某处截断。 BigDecimal完全代表数字,只要你不通过传入一个浮点值来构造它们,在这种情况下,损坏已经在BigDecimal参与之前完成(它在那一点上可以做的就是完全代表浮点近似)原始号码)。我认为使用BigDecimal是解决问题的简单方法。

由于它是一个Groovy脚本,我认为性能不是你最大的考虑因素,如果它(并且你关注通过实例化BigDecimals创建的所有垃圾),那么你可能会考虑JB Nizet建议的delta方法。 (请参阅this article by Peter Lawrey以获取有关如何使用浮点数的一些指示。)但是Java的GC期望有很多短暂的对象,它通常不是最大的性能问题。

有一个关于浮点数与小数点here的问题,其答案描述浮点数不精确的原因。