2012-08-11 60 views
1

我可能错过了一些明显的东西(仍在学习Objective-C!),但由于某种原因,我的一个NSString变量在我的if声明中有一个空值,我不知道为什么?iOS:NSString变量返回null

我甚至输出到NSLog,我仍然不明白为什么它的行为如此。

基本上,用户在文本字段中输入金额(itemWeight),并且此if语句验证输入并根据结果显示警报。这个问题似乎只是当输入0.751时,如果你输入任何其他数量(0.750,0.749,0.752,0.753等),它按预期工作。

相关代码示例如下...

.h文件中:

@property (strong, nonatomic) IBOutlet UITextField *itemWeight; 

.m文件:

NSString *rawWeightText = itemWeight.text; 
float convertedWeightText = rawWeightText.floatValue; 

NSString *weightMessage; 

if (convertedWeightText <= 0.750) 
{ 
    weightMessage = @"under 0.750"; 
} 
else if (convertedWeightText >= 0.751) 
{ 
    weightMessage = @"0.751 or over"; 
} 

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle: @"Error" 
         message: weightMessage 
         delegate: nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil]; 
[alert show]; 

任何想法,我要去哪里错了/我”已经忘记做会非常感激,谢谢!

+0

'NSLog(@“%f”,convertedWeightText)'的输出是什么?你知道的事实是,当我输入一个介于0.750和0.751之间的值时,你的'if-elseif'不匹配? – mAu 2012-08-11 14:48:54

+0

NSLog输出是0.751000 – 2012-08-11 14:52:49

+1

是的,但是这是四舍五入的。 'NSLog(@“%。10f”,convertedWeightText);'给你'0.7509999871' – 2012-08-11 15:02:19

回答

5

望着条件您的if-else如果代码没有从0.750 to 0.751.

浮点值一定要仔细比较的范围内。你应该考虑有关0.751可能性0.75099999...

下面的循环,结果是99.999046,不是100继续添加更多的精度较差。

float a= 0.1f; 
float result = 0.f; 
for(int i = 0; i<1000; i++) 
{ 
    result += 0.1f; 
} 

printf("result:%f", result); //99.999046 

所以,一般来说,不建议比较这些表达式。

if (result == expectedResult) 

建议使用以下方法进行比较。

bool AlmostEqualRelative(float A, float B, float maxRelativeError) 
{ 
    if (A == B) 
     return true; 
    float relativeError = fabs((A - B)/B); 
    if (relativeError <= maxRelativeError) 
     return true; 
    return false; 
} 

欲了解更多信息,请点击此处阅读

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

同时,你必须阅读这个wiki:经常

http://en.wikipedia.org/wiki/Floating_point

http://en.wikipedia.org/wiki/Denormal_number

+0

但0.751被'convertedWeightText> = 0.751'覆盖。所以这不应该成为这种情况下的问题。 – mAu 2012-08-11 14:52:01

+4

0.751不能准确表示为浮点数(使用双数字系统)。它就像小数点后1/3需要小数点后的无限三分之一来表示。 – 2012-08-11 14:54:34

+0

感谢bitmapdata.com和其他人指引我朝着正确的方向发展。我以为我疯了......! :) – 2012-08-11 15:14:24

1

十进制单位c没有完全用二进制表示。当用户输入0.751时,您可能返回的实际浮动量略小,如0.750999942。尝试记录值以查看发生了什么。

0

你不是第一个对浮点数的实际行为感到惊讶的程序员。

实际上它更多的是二进制小数的问题,然后是浮点细节。

尝试将小数部分只有3位数字的0.751转换为二进制数字,您会看到。

为了简短起见,0.751被表示为-1的二进制指数并且浮点数为1.10000000100000110001001的尾数(float仅具有尾数精度的23 + 1位)。

即十进制,指数为-1,尾数为1.5019999742507935。

因此2^-1 * 1.5019999742507935 = 0.7509999871254并且它不通过if中的测试。