Разве NSDecimalNumber не должен быть в состоянии сделать арифметику с основанием 10?

NSDecimalNumber *minVal = [NSDecimalNumber decimalNumberWithString:@"0.0"];
NSDecimalNumber *maxVal = [NSDecimalNumber decimalNumberWithString:@"111.1"];
NSDecimalNumber *valRange = [maxVal decimalNumberBySubtracting:minVal];
CGFloat floatRange = [valRange floatValue];
NSLog(@"%f", floatRange); //prints 111.099998

не NSDecimalNumber должен уметь правильно делать арифметику по основанию 10?

3 ответа

Решение

Хорошо, просто делаю это CGFloat aNumber = 111.1; показывает как 111.099998 в отладчике, даже до того, как над ним была выполнена какая-либо операция. Следовательно, точность теряется, когда она присваивается менее точному типу данных, независимо от каких-либо арифметических операций, выполняемых позже.

Да, NSDecimalNumber работает в базе-10, но CGFloat не делает.

Да, NSDecimalNumber это база-10.

Преобразование в тип с плавающей запятой может потерять точность. В их случае, поскольку пример только что использовал NSLog просто NSLog NSDecimalNumber:

NSDecimalNumber *minVal = [NSDecimalNumber decimalNumberWithString:@"0.0"];
NSDecimalNumber *maxVal = [NSDecimalNumber decimalNumberWithString:@"111.1"];
NSDecimalNumber *valRange = [maxVal decimalNumberBySubtracting:minVal];
CGFloat floatRange = [valRange floatValue];
NSLog(@"floatRange: %f", floatRange);
NSLog(@"valRange: %@", valRange);

NSLog вывод:

floatRange: 111.099998
valRange: 111.1
Другие вопросы по тегам