6

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

例如,

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

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

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

谢谢您的帮助!

编辑

被批准的答案很棒。但是我发现对我有用的是在 NSString stringWithFormat 中使用带有双精度的 %g。%g 似乎非常恰当地四舍五入。前任。

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

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

4

2 回答 2

8

浮点数不能很好地表示特定的数字。使用双精度会减少这种情况发生的频率,但您仍然会遇到问题。有关如何存储浮点数的技术描述(以及为什么我们首先会遇到这个问题)请参阅这篇维基百科文章: 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
于 2012-04-06T21:39:44.437 回答
2

你不能“纠正”一个浮点数,因为浮点数根本不能代表你想要的数字。

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

改用 a double。它们可以表示更大范围的值,因此可以非常精确地表示更多值。如果这还不够好,您将需要进行更精确的操作。可能NSDecimalNumber

于 2012-04-06T21:38:18.627 回答