如何避免条件中双值的舍入误差?

时间:2011-08-02 09:47:36

标签: java double rounding

目前这是我的代码:

if (!flipped){
    scaleX -= 0.1;
    if (scaleX < 0.0001){
      sounds.playSound("flick");
      flipped = true;
   }
 }

以下是我希望它的样子:

if (!flipped){
    scaleX -= 0.1;
    if (scaleX == 0){
      sounds.playSound("flick");
      flipped = true;
   }
 }

我怎样才能做到这一点?因为double值(scaleX)实际上从不为0。

4 个答案:

答案 0 :(得分:2)

您想要定义某种容差,然后执行:

if (Math.abs(scaleX) < tolerance)

您不应该检查正好零的值 - 只是“足够接近零”。这只是二进制浮点类型的一种生活方式......像“0.1”和“0.0001”这样的东西在二进制浮点中并不完全可以表示,这就是你遇到这种情况的原因。

为什么你不喜欢原始代码,为什么你希望它成为第二种形式。除了没有取绝对值,第一个代码看起来没问题。 (我将提取常量,但这是一个单独的问题。)

答案 1 :(得分:1)

你不能,因为浮点数学不能产生精确的结果,因为只有2 ^ 64个双值来表示数字的无穷大。

答案 2 :(得分:1)

使用浮点运算时,通常在概念上写一个“非常接近”而不是等于。

 if ( x - y < verySmallValue )

而不是

 if ( x == y )

你的y是0,所以你正在写

 if ( x < verySmallValue)

我觉得这个概念很好。

答案 3 :(得分:0)

根据变量的用法,您可能希望使用BigDecimal类。