我可能遗漏了一些明显的东西(仍在学习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];
任何我出错的想法/我忘记做的事都会非常感谢,谢谢!
答案 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:
答案 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中的测试。