是不是NSDecimalNumber应该能够做基数为10的算术?

时间:2011-12-13 22:33:24

标签: ios math floating-point nsdecimalnumber

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是不是应该能够正确执行base-10算法?

3 个答案:

答案 0 :(得分:3)

是的,NSDecimalNumber在base-10中运行,但CGFloat没有。

答案 1 :(得分:1)

是的,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

答案 2 :(得分:0)

好的,只需将CGFloat aNumber = 111.1;显示为调试器中的111.099998即使在对其执行任何操作之前。因此,无论以后发生的任何算术运算如何,精度都会在分配给精度较低的数据类型时丢失。