1

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

我什至已经输出到 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];

任何我出错的想法/我忘记做的事情将不胜感激,谢谢!

4

3 回答 3

5

查看 if-else if 代码的情况,如果代码没有 from 的范围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

于 2012-08-11T14:49:35.817 回答
1

十进制值通常不能用二进制精确表示。当用户输入 0.751 时,您返回的实际浮点数可能会稍小,例如 0.750999942。尝试记录该值以查看发生了什么。

于 2012-08-11T15:00:42.440 回答
0

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

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

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

简而言之,0.751 表示为 -1 的二进制指数和浮点数中的尾数 1.10000000100000110001001(浮点数只有 23+1 位的尾数精度)。

也就是说,在十进制中,指数为 -1,尾数为 1.5019999742507935。

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

于 2012-08-11T15:05:02.043 回答