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

例如,

输入时:
“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 ,然后使用该方法似乎对我有用,我希望这对其他人也有帮助。如果这不是您想要的答案,请查看批准的答案!

最佳答案

浮点数不能很好地表示特定数字。使用double将减少这种情况的发生,但是您仍然会遇到问题。有关如何存储浮点数(以及为什么我们首先遇到这个问题)的技术说明,请参阅此Wikipedia文章: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

关于iphone - 校正浮点数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10049533/

10-11 14:42