1) Какое максимальное число у float? Могу ли я хранить в нём большие числа, например миллиард? В документации пишут число 3.402823466 E + 38, но я не понимаю, что тут написано, как понять в обычных числах?
Просто хочу понять, можно ли использовать float для золота в игре? Я понимаю, что лучше использовать int, но мне будет сложно сделать int и float в своём движке, так как я делаю свой мини-скрипт, чтоб управлять числами, и храню все числа в dictionary, мне и так для этого пришлось два dictionary сделать, float и string, а теперь думаю может придётся ещё третий dictionary вводить - int?! Или же можно обойтись без int, используя float?!
2) Можно ли как-то сделать так, чтобы float имел только два знака после запятой 1000.03 например. Мне не нравится, что у float может запятая далеко уходить. Есть ли какие-то преднастройки float в C# или придётся работать с числами типа 1000.03034045? Мне бы хватило сотых долей, абсолютно для любых моих нужд в игре, ибо мне не нужна сверх точность в тысячных долях. 3) Насколько точно оператор if проверяет float? Может ли оператор ошибиться? Просто я как-то встречал феномен, когда в юнити я ставлю координаты 0.05, а через некоторое время юнити мне портит это число превращая его в 0.049999999999, хз с чем это связано, но я боюсь, что однажды проверка не пройдёт. Например поставлю float = 4, а юнити мне сделает 3.999999999 и if пропустит, я не знаю как оно работает, но мало ли.
PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f, Но как сделать подобный трюк, чтобы C# у всех для меня нужных int, считал последние две цифры как сотые доли?
Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 05:45
Могу ли я хранить в нём большие числа, например миллиард?
нет, на миллиарде уже слишком низкая точность, числа будут округляться на плюс минус несколько сотен в разные стороны
Цитата
if пропустит, я не знаю как оно работает, но мало ли.
именно так оно и работает и честно говоря об этом написано в первых главах любого учебника по программированию где вообще упоминаются числа с плавающей запятой
Цитата
PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f,
именно так это и сделано в 99.9999% приложений и игр
Цитата >>PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f,
именно так это и сделано в 99.9999% приложений и игр
А как это реализуют? Есть ли английское название у этого феномена, чтоб погуглить?! Или разработчики просто в уме держат, что 100 = 1.00f, а там где это число надо вывести на экран снижают на два нуля? Хотелось бы не запутаться, чтоб в уме не держать, но как реализовать, что-то идеи не приходят.
Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 06:39
делаешь int поле, в нем хранишь копейки (центы, медные монеты, и тд, короче минимальный юнит твоей валюты) все расчеты ведешь в этих копейках и только при выводе на экран конвертируешь в рубли+копейки (или золото+серебро+медь, и тд)
Сообщение отредактировал drcrack - Понедельник, 06 Января 2020, 06:38
drcrack, а как быть с другими переменными, например Health? Какие там копейки? Просто иногда в игре может нужно отнять 0.02 HP например. Там тоже в уме держать, что 1000 HP, это значить 10.00 HP на самом деле?
Добавлено (06 Января 2020, 07:04) --------------------------------------------- afq, Спасибо, погуглю, не знаю пока ничего про это. Если там также нестабильно работает проверка "if" как во float, то не очень хорошая перспектива.
Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 07:05
"0.02 HP" вообще не имеет смысла т.к. HP это health (hit) point и он неделим по определению
У меня в ролевой игре, если уровень слишком маленький, то будет отниматься здоровье меньше, чем 1, это главная причина, почему я хочу оставить float, но боюсь что оно также и не точные параметры имеет. Не знаю как сделать, чтобы были и сотые доли, и числа точные, и не ниже 0.01.
Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 08:28
в C# есть тип decimal, можешь его использовать, но он будет медленнее и занимет больше памяти. При работе с финансами в реальном мире часто пользуется подобным типом. У decimal не будут подобных казусов с превращением 0.5 в 0.49999.
Или разработчики просто в уме держат, что 100 = 1.00f, а там где это число надо вывести на экран снижают на два нуля?
Чтобы не держать в голове - можно написать функцию хелпер, к примеру, для форматирования числа, что-то вроде: `formatMoney(10050)` которая всегда будет преобразовывать число в строку типа: '100.50'. В будущем еще и может помочь, если ты решишь изменить количество знаков после запятой, надо будет только пару функций подправить и все.
Но вообще, не спеши отказывать от float, просто научись правильно их сравнивать. Не стоит никогда делать сравнения типа (a == b) или (a >= b). Лучше просто сравнивать граничащие значения, к примеру, если здоровье меньше 0.5 то изменить цвет health bar'а. Если же нужно сравнить, что float примерно равен 0.5, то почитай вот это: https://floating-point-gui.de/errors/comparison/ и используй функцию `nearlyEqual`.