2
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 为底的算术吗?

4

3 回答 3

3

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

于 2011-12-13T22:44:59.553 回答
1

是的,NSDecimalNumber是以 10 为基数的。

转换为浮点类型会降低准确性。在他们的情况下,因为该示例仅使用NSLog了:NSLogNSDecimalNumber

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
于 2011-12-13T23:45:23.027 回答
0

好的,即使在对其执行任何操作之前,也只是在调试器中CGFloat aNumber = 111.1;显示。因此,当将精度分配给不太精确的数据类型时,精度就会丢失,而不管以后发生的任何算术运算如何。111.099998

于 2012-03-22T15:19:14.077 回答