Разве NSDecimalNumber должен быть в состоянии выполнить арифметику с основанием 10? - PullRequest
2 голосов
/ 14 декабря 2011
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 ]

3 голосов
/ 14 декабря 2011

Да, NSDecimalNumber работает в base-10, но CGFloat не работает.

1 голос
/ 14 декабря 2011

Да, 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
0 голосов
/ 22 марта 2012

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

...