Странное поведение float

Программирование на Юнити.

Странное поведение float

Сообщение HacKeR 20 янв 2017, 04:14

Всем привет. Сегодня пронаблюдал странное поведение float.
Вот кусок кода:
float xp = KMLController.lonToX(ajObject.position.x) * 50.7f;
из lonToX выходит float с примерным значением: 197516.62.
но в xp записывается значение "10014093" после умножения вместо "10014092.634"

Как убрать округление?
HacKeR
UNIверсал
 
Сообщения: 360
Зарегистрирован: 12 ноя 2010, 21:14

Re: Странное поведение float

Сообщение waruiyume 20 янв 2017, 04:28

Использовать Double.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Странное поведение float

Сообщение Vol4ica 20 янв 2017, 19:00

А ты юнити обновлял до 5.5.0f3?
У меня после обновления флоат тоже странно себя ведет, только вместо лишнего округления происходит лишнее разбиение. Я 10 раз прибавляю к числу 5 число 0.1, и вместо того чтобы дать на выходе 6 юнити каждый раз прибавлял не 0.1 а 0.0999995, давая ответ 5.999995...
Аватара пользователя
Vol4ica
UNец
 
Сообщения: 32
Зарегистрирован: 03 июн 2016, 23:10

Re: Странное поведение float

Сообщение getAlex 23 янв 2017, 17:32

Vol4ica писал(а):А ты юнити обновлял до 5.5.0f3?
У меня после обновления флоат тоже странно себя ведет, только вместо лишнего округления происходит лишнее разбиение. Я 10 раз прибавляю к числу 5 число 0.1, и вместо того чтобы дать на выходе 6 юнити каждый раз прибавлял не 0.1 а 0.0999995, давая ответ 5.999995...

У float точность 7 знаков. Все остальные цифры будут взяты наобум, в зависимости от процессора.
Пример:
число 12345678.9 превратится в 1234567.случаные_числа
число 1.23456789 превратится в 1.234567случаные_числа

Почему так сделано? Потому что хранение одного числа с бесконечным числом знаков после запятой будет занимать бесконечно памяти. Округление тут не работает т.к. у кого-то будет 1234567.9, а у другого 1234567.2 ( 9 и 2 - случайные числа, которые были созданы разными моделями проца). И округление приведёт к тому, что один сетевой игрок говорит что у него 1234568 патронов, а другой говорит что нифига, у тебя 1234567 патронов. Патроны заканчиваются и человек убивает тебя последним несуществующим патроном, а у тебя на экране он не убивает тебя и делает перезарядку.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12