iPhone / Obj C: Почему преобразование float в int: (int) float * 100 не работает? - PullRequest
1 голос
/ 18 января 2011

В моем коде я использую float для расчета валюты, но округление дало нежелательные результаты, поэтому я пытаюсь преобразовать все в int. С минимальными изменениями инфраструктуры, в моих функциях инициализации, я сделал это:

-(id)initWithPrice:(float)p;
{
[self setPrice:(int)(p*100)];
}

Я умножаю на 100 б / с в главном разделе, значения даны от .xx до 2 десятичных знаков. Я ненормально замечаю, что для float 1.18 int округляет его до 117. Кто-нибудь знает, что это делает? Поплавок оставляет его как 1.18. Я ожидаю, что это будет 118 для int эквивалент в центах.

Спасибо.

1 Ответ

4 голосов
/ 18 января 2011

Плавающая точка всегда немного неточна.При кодировании с плавающей запятой IEEE степени двух могут быть представлены точно (например, 4,2,1,0.5,0.25,0.125,0.0625, ...), но числа, подобные 0,1, всегда являются приблизительными (просто попробуйте представить их как суммустепеней 2).

Ваш (int) состав будет усекать все, что приходит, поэтому, если p * 100 разрешается до 117,99999995 из-за этой неточности, оно становится 1,17 вместо 1,18.

* 1004Лучшее решение - использовать что-то вроде roundf на p * 100.Еще лучше было бы, если бы вы могли идти вверх по течению и полностью преобразовать математику с фиксированной запятой, используя целые числа во всей программе.
...