2014-12-23 1 views
1

Вот проблема:Когда я вычитать/некоторые 0,05 это некоторые/вычитать 0,05000001 (вар был объявлен как номер)

когда VX некоторые или вычитать на 0,05 он вычитает/некоторые 0,05000001 (Это принять участие в Ввод-кадров, кадров в секунду)

 **if(vx < 5 && KR){ 
      vx += 0.05; 
     }else if(vx > 0 && !KR){ 
      vx -= 0.05; 
     }else if(vx < 0 && !KL){ 
      vx += 0.05; 
     }else if(vx < -5 && KL){ 
      vx -= 0.05; 
     } 
     if(vy < 5 && KD){ 
      vy += 0.05; 
     }else if(vy > 0 && !KD){ 
      vy -= 0.05; 
     }else if(vx < -5 && KU){ 
      vy -= 0.05; 
     }else if(vx < 0 && !KU){ 
      vy += 0.05; 
     } 
+0

Ну, это определенно ошибка округления с плавающей точкой. – Iggy

+0

https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf (Есть * soo many * duplicates of this.) – user2864740

+0

Возможный дубликат [Есть математика с плавающей запятой?] (Http: //stackoverflow.com/questions/588004/is-floating-point-math-broken) – user2864740

ответ

3

числа с плавающей точкой свойственна неточность - множество рациональных чисел бесконечно, но с плавающей точкой Number -s сохраняются на 64 бита, в соответствии со стандартом IEEE-754. Очевидно, что 64 бита не являются бесконечным числом бит, поэтому некоторые значения с плавающей запятой могут быть представлены точно, а другие - нет.

В общем, вы не можете полагаться на число с плавающей запятой, чтобы иметь то же точное значение, которое вы пытаетесь назначить ему.

var n:Number = 0.05; 

будет переведена компилятором в представление с плавающей запятой в 0.05 и что может ввести ошибку округления.

При работе с числами с плавающей запятой вам обычно нужно использовать диапазон вокруг нужного числа, вместо того, чтобы проверять точное равенство. Так что вместо того, чтобы делать

if (n == 0.05) // this may or may not fail, based on rounding 

вы должны сделать что-то вроде

if ((n > 0.04) && (n < 0.06)) // this will more likely work 

Диапазон до вас - вы должны решить, сколько разница является приемлемым, когда вы делаете чек (здесь я использовал 0.01). Чем меньше диапазон, тем больше вероятность того, что вы столкнетесь с ошибками округления. Чем больше диапазон, вы получите все больше и больше неточных номеров, которые проходят проверку.

Вот довольно приличный article, который более подробно освещен. В Интернете также есть много ресурсов о том, как правильно работать с числами с плавающей запятой.

+0

Большое спасибо, проблема решена! –

+0

@ user3732380 Вы очень желанны. – xxbbcc