修正浮点数

时间:2012-04-06 21:35:51

标签: iphone ios xcode cocoa-touch cocoa

我想知道是否有一种方法可以轻松安全地纠正浮点数。

例如,

输入时: “32 + 32.1” 结果: “64.0999999999999”

此外,我必须提到,使用科学记数法时,这种情况经常发生。 “(2.3 * 10 ^ 23)*(1.452 * 10 ^ 23)” 返回: “3.339599999999999999e + 46”

最后,有时返回的数字是: 恩。 123.0000000000001

感谢您的帮助!

修改

批准的答案很棒。但我发现对我有用的是在NSString stringWithFormat中使用%g和double。 %g似乎非常恰当地围绕一切。 离。

    answer.text = [NSString stringWithFormat@" %g ", doubleAnswer];

在计算中使用双打,然后使用该方法似乎对我有用,我希望这对其他人也有帮助。如果这不是您要找的答案,请查看已批准的答案!

2 个答案:

答案 0 :(得分:8)

浮点数不能很好地代表具体数字。使用double会使这种情况发生的频率降低,但你仍然会遇到问题。有关如何存储浮点数的技术说明(以及为什么我们首先遇到此问题)请参阅此维基百科文章: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

答案 1 :(得分:2)

您无法“更正”浮点数,因为浮点数不能代表您想要的数字。

浮点数非常不精确,通常不应该用于涉及大量计算的任何事情,因为累积误差通常是灾难性的。

请改用double。它们可以代表更大范围的值,因此可以非常精确地代表更多的值。如果这还不够好,你需要转向更精确的东西。可能是NSDecimalNumber