двойной тип данных + iphone - PullRequest
4 голосов
/ 21 июня 2011

у меня есть одно приложение, которое я знаю. Диапазон значений типа double равен **1.7E +/- 308 (15 digits).**, но в моем приложении я должен уменьшить значение текстового поля до 100.0 мой код

double value=[strPrice doubleValue]/100.0;
NSString *stramoount=[@"" stringByAppendingFormat:@"%0.2f",value ];

когда я делю 34901234566781212 на 100 , это дает мне 349012345667812.12 , но когда я набираю 349012345667812124 и делю на 100 это дает мне 100 это дает мне 3490123456678121.00 , что неправильно, если я изменяю тип данных или как я могу изменить свой код

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Номер 349012345667812124 имеет 18 десятичных цифр.формат double обеспечивает лишь немногим менее 16 десятичных цифр точности (фактическое число не является целым числом, поскольку двоичные цифры формата не соответствуют непосредственно десятичным).Таким образом, совершенно ожидаемо, что последние 2 или 3 цифры не могут быть представлены точно, и это уже происходит, когда литерал "349012345667812124" анализируется в формате double, прежде чем произойдут какие-либо вычисления.

Тот факт, чтовы получите ожидаемый результат с числом 34901234566781212, ничего не значит;просто оно достаточно близко к ближайшему значению, которое может представлять формат double.

Чтобы избежать этой проблемы, используйте типы NSDecimal или NSDecimalNumber.

1 голос
/ 21 июня 2011

Использование

NSDecimalNumber * dec=[[NSDecimalNumber decimalNumberWithString:value.text locale:  [NSLocale currentLocale]] decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"100" locale:[NSLocale currentLocale]]];  
NSLog(@"%@",dec);

вместо Double

...