Почему я получаю странный результат для этой суммы, используя Java для Android?

#java #android #double

#java #Android #двойной

Вопрос:

Итак, я делаю что-то очень простое. У меня есть две переменные экземпляра, newX и newY. Оба эти удвоения инициализированы значением 0.0.

Во время цикла обновления я выполняю это вычисление:

 long now = System.currentTimeMillis();
double elapsed = (now - mNextTime)/1000.0; // convert to seconds
Log.i("nx", newX   "   "   elapsed   " = "   (newX   elapsed));
newX = newX   elapsed;
newY  = newY   elapsed;
  

Вот несколько итераций инструкции logging, это то, что я не могу объяснить:

 1.3073173811609962E9   0.058 = 1.3073173812189963E9
1.3073173812189963E9   0.112 = 1.3073173813309963E9
1.3073173813309963E9   0.02 = 1.3073173813509963E9
1.3073173813509963E9   0.018 = 1.3073173813689961E9
1.3073173813689961E9   0.018 = 1.307317381386996E9
1.307317381386996E9   0.101 = 1.307317381487996E9
  

Почему 1.307 0.112 = 1.307?? Я очень смущен.

Комментарии:

1. Проблемы с числами с плавающей запятой в Java?… smashing mag опубликовал статью о проблемах, связанных с javascript, здесь: smashingmagazine.com/2011/05/30 / … та же проблема будет применяться в java, хотя я не думаю, что это ваш ответ. Просто хотел указать на это.

2. Что произойдет, если вы сделаете: double testNewX = newX elapsed; Log.i( testNewX );

Ответ №1:

Обратите внимание на E9. Вы смотрите на очень большие числа.

1E9 = 1,000,000,000

итак

1.3073173811609962E9 0.058 = 1,307,317,381.21899623

Комментарии:

1. Я только что понял, что я делал! Спасибо за это. mLastTime инициализировался на 0, полностью облажавшись со мной. Простая ошибка, спасибо!

2. @Matthew возможно, mNextTime == 0?