2012-04-06 34 views
6

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

例如,

进入时间: “32 + 32.1” 结果: “64.0999999999999”

另外不得不提的是该使用科学记数时出现相当频繁。 “(2.3 * 10^23)*(1.452 * 10^23)” 返回: “3.339599999999999999e + 46”

最后,有时返回的号码为: 离。 123.0000000000001

感谢您的帮助!

编辑

是被批准的答案是伟大的。但是我发现为我工作的是在NSString stringWithFormat中使用%g和double。 %g似乎将所有事情做得相当恰当。 ex。

answer.text = [NSString [email protected]" %g ", doubleAnswer]; 

通过你的计算使用双打,然后使用该方法似乎为我工作,我希望这可以帮助其他人。如果这不是您寻找的答案,请查看获得批准的答案!

回答

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

ahh true true,但是如果我想将其显示为62.1,但仍然有可能显示64.1065(例如,我正在寻找btw,谢谢。) – 2012-04-06 21:46:52

+1

然后,您或者需要跟踪你想要显示的小数(杂乱)或不使用float并移动到另一种类型的变量(可能是'NSDecimalNumber')。 – lnafziger 2012-04-06 21:48:42

+1

我会试试看。 – 2012-04-06 21:50:44

2

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

浮点数非常不精确,通常不应该用于涉及大量计算的任何事情,因为累积误差通常是灾难性的不好的。使用double代替。它们可以代表更大范围的值,因此可以非常精确地表示更多的值。如果这不够好,你需要更精确地转向某种东西。可能NSDecimalNumber