неточность float в printf / appendFormat - PullRequest
0 голосов
/ 21 марта 2012

У меня есть значение с плавающей запятой, которое я хотел бы показать в формате строки и, если оно соответствует целому числу, с отображением целого числа, если нет, с одним десятичным знаком.

Как это:

3.1
3
2.9
2.8

Пока я застрял в концепции, я бы сделал что-то вроде этого:

float myFloat = 3.1
float mySecondFloat = 3
[NSString stringWithFormat:@"%g %g", myFloat, mySecondFloat];

Мой вопрос:

1 / формат типа "% g" работает в большинстве случаев, но иногда я получаю результат, показанный как "0.600001", в то время как в действительности должно быть 0,6, потому что все, что я делаю, это 0,7 - 0,1.

Существует ли тип приведения типа float с 1 десятичным знаком или, возможно, побитовая операция, чтобы избавиться от окончательной неточности, или другой способ заставить его работать в 100% случаев?

Спасибо за ваши ответы.

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Если вам нужна абсолютная точность при работе с десятичными числами, вы можете рассмотреть возможность использования класса NSDecimalNumber.

Темы программирования чисел и значений: использование десятичных чисел

В противном случае спецификатор формата %.1g будет в порядке.

1 голос
/ 21 марта 2012

Вы должны использовать этот код:

float myFloat = 3.1
float mySecondFloat = 3
[NSString stringWithFormat:@"%.1f %.1f", myFloat, mySecondFloat];

EDIT:

Если бы я действительно хотел напечатать целочисленное значение с плавающей точкой, я сделал бы это следующим образом (некрасивый код)

int intValue = myFloatNumber/1;
NSString *string;
if(myFloatNumber == intValue)
{
     string = [NSString stringWithFormat:@"%.0f", myFloatValue];
}
else
{
    string = [NSString stringWithFormat:@"%.1f", myFloatValue];
}

Делая целочисленное деление на 1, вы автоматически приводите свой float к int. Когда у вас есть строка NSString *, вы можете присоединить ее к вашей строке.

0 голосов
/ 22 марта 2012

Видя ответы других, кажется, что для этого нет стандартного C-форматера.

Я пошел после ответа Николаса (NSDecimalNumber), отсюда и флаг разрешения. Это работало действительно хорошо, но в моем (очень простом) случае это могло бы быть излишним. Если подумать, если бы мне пришлось делать это снова, я бы подумал, что я бы использовал NSNumberFormatter только для NSNumber (используя numberWithFloat: method)

Если это может кому-то помочь ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...