Разве 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