2012-02-26 53 views
1

有人可以告诉我如何将浮点数的精度设置为期望的长度。说我有一个数字2504.6。正如你所看到的,这里的精度只有1.我想将它设置为6.我需要这个,因为我将该值与从 [txtInput.text floatValue]获得的值进行比较。即使我在文本框中输入2504.6,它也会增加5个精度,并且会达到2504.600098。当我比较这两个值时,它们看起来不相等。Objective-C - 如何提高浮点数的精度

+0

你试过'double'? – 2012-02-26 17:50:39

+0

不是我没有,会不会很重要?我的意思是,不是双倍大于浮动的两倍?我的意思是精确度。 – 2012-02-26 19:15:15

+0

'double'给你提供了大约两倍的精度。 – 2012-02-26 19:18:53

回答

3

可以使用NSDecimalNumber比较数字:

NSDecimalNumber *number = [NSDecimalNumber numberWithFloat:2504.6f]; 
NSDecimalNumber *input = [NSDecimalNumber decimalNumberWithString:txtInput.text]; 
NSComparisonResult result = [number compare:input]; 

if (result == NSOrderedAscending) { 
    // number < input 
} else if (result == NSOrderedDescending) { 
    // number > input 
} else { 
    // number == input 
} 
3

花车近似。存储浮动的方式不允许任意的精度。浮点数(和双精度)设计用于存储非常大(或小)的值,但不是精确的值。

如果您需要非常精确的非整数,请使用int(或long)并对其进行缩放。你甚至可以编写自己的对象类来处理它。

他们将不会出现等于

顺便说一下这个问题已经被问过

Comparing float and double data types in objective C

Objective-C Float/Double precision

Make a float only show two decimal places

+1

一个长只能给你3个十进制数字比2倍更精确。 – 2012-02-26 17:55:56

+0

@Oli但不会有近似值。 – Sulthan 2012-02-26 18:03:37

+0

@Sulthan:定义“逼近”。 float **是一个具有相关缩放因子的整数。 – 2012-02-26 18:05:06

3

比较两个浮点型变量A和B使用'平等'运营商不是很好的主意,导致浮动数量有限cision。比较浮动的最好办法是

fabs(A - B) < eps 

,其中每股收益为一些很小的值,即0.0001

如果您与代表浮点值,你可以只是比较字符串,而不是数字的字符串操作。

+0

只有当OP不需要比较结果是*正确*(我的意思是没有近似值),如果用户实际输入2504.600098,这才起作用。 – sch 2012-02-26 18:08:53