Java: что-то теряется при применении + =

Это мой код, но его вывод имеет смысл.

long currentTime;
long stateStartTime;
int delta;
float speed;

// I do something

System.out.println();
System.out.println(currentTime);
System.out.println(stateStartTime);
System.out.println(delta);
System.out.println(speed);
System.out.println(delta * speed);
System.out.println(currentTime - (stateStartTime + (delta * speed)));
stateStartTime += delta * speed;
System.out.println(currentTime - stateStartTime);

Выход:

1350065634345877
1350065121656832
1
5.0E8
5.0E8
0.0
-24181867

Я ожидал, что последние две строки будут:

12689045
12689045

Но на удивление я получил вышеуказанный результат. Почему?

Я предполагаю, что вы что-то делаете ... но мы не видим что :)

Zephyr 27.10.2018 16:33

В вашем Java-коде есть операторы печати восемь, но на выходе есть только строки Семь. Я предполагаю, что это какая-то ошибка переполнения / округления.

Tim Biegeleisen 27.10.2018 16:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не теряйте точность и не ждите, что компьютер воссоздает ее.

long currentTime = 1350065634345877L;
long stateStartTime = 1350065121656832L;
long delta = 1L;
double speed = 5.0E8;

И ваши последние две строки (без других изменений) выводят

1.2689045E7
12689045

Чтобы предпоследняя строка соответствовала последней строке, вы можете использовать BigDecimal, например

System.out.println(new BigDecimal(currentTime - (stateStartTime + (delta * speed)))
        .toPlainString());

Я думал, что long + float сначала приведет к удвоению числа с плавающей запятой, я предполагаю, что он отправляет длинную позицию на плаву.

Ilya Gazman 27.10.2018 16:58

Другие вопросы по теме