iOS:NSString变量返回null

时间:2012-08-11 14:44:11

标签: objective-c ios nsstring null

我可能遗漏了一些明显的东西(仍在学习Objective-C!)但由于某种原因,我的一个NSString变量在我的if语句中有一个空值而我不知道为什么?< / p>

我甚至输出到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];

任何我出错的想法/我忘记做的事都会非常感谢,谢谢!

3 个答案:

答案 0 :(得分:5)

查看if-else的条件if代码的范围不是 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

答案 1 :(得分:1)

十进制值通常无法用二进制精确表示。当用户输入0.751时,你回来的实际浮动可能会略微变小,如0.750999942。尝试记录该值以查看正在进行的操作。

答案 2 :(得分:0)

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

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

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

为了使其变短,0.751表示为-1的二进制指数,并且在浮点数中尾数为1.10000000100000110001001(浮点数对于尾数只有23 + 1位精度)。

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

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