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算法?
答案 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
,即使在对其执行任何操作之前。因此,无论以后发生的任何算术运算如何,精度都会在分配给精度较低的数据类型时丢失。