浮点数不能很好地表示特定的数字。使用双精度会减少这种情况发生的频率,但您仍然会遇到问题。有关如何存储浮点数的技术描述(以及为什么我们首先会遇到这个问题)请参阅这篇维基百科文章: IEEE 754-1985。(基本上,浮点数被存储为值的二进制表示,并且只有这么多位可供使用,因此它们很快用完并且必须四舍五入到它们能够表示的最接近的值。)
通常,您不必担心 +/- .0000001,只需在您想用适当的小数点数向用户显示它们时格式化它们,它就会被四舍五入。但在内部,它的存储方式并不重要。
例如,如果您想显示“结果”,您可以执行以下操作:
float myFloat = 32 + 32.1;
NSString *result = [NSString stringWithFormat:%@"%.2f", myFloat];
// result will contain 64.10
如果您不想要固定数量的小数点,您还可以使用浮点到字符串的转换功能NSNumber
:
float myFloat = 32 + 32.1;
NSNumber *myNumber = [NSNumber numberWithFloat:myFloat];
NSString *result = [myNumber stringValue];
// result will contain 64.1
NSDecimalNumber
将为您处理所有这些,但它涉及更多并且涉及更多开销,但这里有一个示例可以帮助您入门:
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"32"];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"32.1"];
// Or since you use exponents:
// NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithMantissa:321 exponent:-1 isNegative:NO];
NSDecimalNumber *myNumber = [num1 decimalNumberByAdding:num2];
NSString *result = [myNumber stringValue];
// result will contain 64.1