修正浮点数
我想知道是否有一种方法可以轻松安全地更正浮点数。
例如,
input时:“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];
通过计算使用双打,然后使用这种方法似乎对我有用,我希望这也可以帮助其他人。 如果这不是您要找的答案,请查看批准的答案!
浮点数不能很好地表示具体的数字。 使用double将会使这种情况发生得less,但是你仍然会遇到这个问题。 有关如何存储浮点数的技术说明(以及为什么我们首先遇到这个问题),请参阅本维基百科文章: IEEE 754-1985 。 (基本上,浮点数是作为值的二进制表示forms存储的,只有很多位才能使用,所以它们很快就会耗尽,不得不四舍五入到它们能够表示的最接近的值)。
通常情况下,您不必担心+/- .0000001,只需要用适当数量的小数点将它们显示给用户时,就可以对其进行格式化,并且会变为四舍五入。 从内部来看,它的存储方式并不重要。
例如,如果你想显示“结果”,你可以做这样的事情:
float myFloat = 32 + 32.1; NSString *result = [NSString stringWithFormat:%@"%.2f", myFloat]; // result will contain 64.10
如果你不想要一个固定的小数点数,你也可以使用NSNumber
的float to string转换能力:
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
你不能“更正”一个浮点数,因为浮点数不能代表你想要的数字。
浮点数是非常不精确的,通常不应该用于涉及大量计算的任何事情,因为累积误差往往是灾难性的。
使用double
代替。 它们可以代表更大范围的价值,因此可以相当准确地代表更多的价值。 如果这还不够好,你需要更精确地转向某种东西。 可能是NSDecimalNumber
。