Задача c: Разбор строки для плавания, избегать лишних десятичных знаков - PullRequest
0 голосов
/ 26 июля 2011

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

Проблема заключается в том, что я конвертирую число с плавающей точкой, например:

myString = @"13502.63"
float *f = [myString floatValue];
NSLog(@"Converted %f", f);

Результат "f" равен 13502.629883

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

Кто-нибудь может мне помочь, пожалуйста?

Спасибо

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Если вы хотите точности, вы не должны использовать float.Используйте NSDecimalNumber .

NSString *myString = @"13502.63";
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:myString];
1 голос
/ 26 июля 2011

float числа не имеют точного представления, поэтому «13502.63» преобразуется в 13502.629883;это ближайший к исходному числу число с плавающей точкой.

Итак, я не думаю, что с помощью float есть простое решение.Вы должны попробовать NSDecimalNumber.Я не знаю о производительности, но она должна дать вам точное представление.

1 голос
/ 26 июля 2011

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

Рассматривали ли вы использовать NSDecimalNumber?

Они будут намного медленнее, чем float, но если это не проблема, то они гораздо точнее для таких вычислений.

Если вам по какой-то причине нужна скорость, достаточно ли точного двойного или длинного двойного?

...