Iphone 目标-C比较浮动的If语句不起作用
这简直是我遇到过的最奇怪的事情。因此,我有一个名为Iphone 目标-C比较浮动的If语句不起作用,iphone,objective-c,ios,xcode,if-statement,Iphone,Objective C,Ios,Xcode,If Statement,这简直是我遇到过的最奇怪的事情。因此,我有一个名为ratingDecimal的浮点,我使用一些条件来比较它。以下是条件的情况: if (ratingDecimal >= 0.0) { if (ratingDecimal < 0.3 && ratingDecimal != 0.3) { ratingDecimal = 0.0; NSLog(@"bigger or equal to 0 and smaller than
ratingDecimal
的浮点,我使用一些条件来比较它。以下是条件的情况:
if (ratingDecimal >= 0.0) {
if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {
ratingDecimal = 0.0;
NSLog(@"bigger or equal to 0 and smaller than 0.3");
}
}
if (ratingDecimal >= 0.3) {
if (ratingDecimal < 0.8 && ratingDecimal != 0.8) {
ratingDecimal = 0.5;
NSLog(@"middle");
}
}
if (ratingDecimal >= 0.8) {
NSLog(@"bigger or equal to 0.8");
ratingDecimal = 1.0;
}
但我不明白
大于或等于0.8
你可能想知道为什么我的情况如此乏味和复杂,它们可以简单到:
if (ratingDecimal >= 0.3 < 0.8)
if(ratingDecimal>=0.3<0.8)
他们过去是这样的,但由于这从来没有起过作用,我一直在打破这种说法,它仍然表现得很奇怪
为什么会这样
下面是一个图像示例:
您的
分级十进制值可能类似于0.7999999999。当打印到控制台时,可能有东西将其四舍五入到0.8,但比较结果仍然认为它小于0.8
这是由于浮点数的二进制性质造成的。有关这方面的详细信息,请参阅。您的ratingDecimal
值可能类似于0.7999999999。当打印到控制台时,可能有东西将其四舍五入到0.8,但比较结果仍然认为它小于0.8
这是由于浮点数的二进制性质造成的。有关这方面的详细信息,请参阅。@Greg给出了一个很好的答案。我想指出的是,您可以以更清晰、更简单的方式编写代码:
if (ratingDecimal >= 0.0) {
if (ratingDecimal < 0.3) {
ratingDecimal = 0.0;
NSLog(@"bigger or equal to 0 and smaller than 0.3");
} else if (ratingDecimal < 0.8) {
ratingDecimal = 0.5;
NSLog(@"middle");
} else {
ratingDecimal = 1.0;
NSLog(@"bigger or equal to 0.8");
}
} else {
// negative
}
if(ratingDecimal>=0.0){
if(额定小数<0.3){
比率十进制=0.0;
NSLog(@“大于或等于0且小于0.3”);
}否则如果(额定小数<0.8){
比率小数=0.5;
NSLog(@“中”);
}否则{
比率十进制=1.0;
NSLog(@“大于或等于0.8”);
}
}否则{
//否定的
}
作为FYI-一条线,例如:
if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {
if(ratingDecimal<0.3&&ratingDecimal!=0.3){
没有这样的意义。如果一个数字小于0.3,那么它必须不等于0.3,所以第二次检查没有任何用处。@Greg给出了一个很好的答案。我想指出的是,您可以用更清晰、更简单的方式编写代码:
if (ratingDecimal >= 0.0) {
if (ratingDecimal < 0.3) {
ratingDecimal = 0.0;
NSLog(@"bigger or equal to 0 and smaller than 0.3");
} else if (ratingDecimal < 0.8) {
ratingDecimal = 0.5;
NSLog(@"middle");
} else {
ratingDecimal = 1.0;
NSLog(@"bigger or equal to 0.8");
}
} else {
// negative
}
if(ratingDecimal>=0.0){
if(额定小数<0.3){
比率十进制=0.0;
NSLog(@“大于或等于0且小于0.3”);
}否则如果(额定小数<0.8){
比率小数=0.5;
NSLog(@“中”);
}否则{
比率十进制=1.0;
NSLog(@“大于或等于0.8”);
}
}否则{
//否定的
}
作为FYI-一条线,例如:
if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {
if(ratingDecimal<0.3&&ratingDecimal!=0.3){
没有这样的意义。如果一个数字小于0.3,那么它必须不等于0.3,所以第二次检查没有任何用处。您可以根据需要使用像roundf()这样的函数。您可以根据需要使用像roundf()这样的函数。这也是很难获得3*(1/3)的原因
等于十进制中的1
。当乘以3
时,没有固定长度的十进制值给出1
。在大多数固定长度十进制系统中3*(1/3)
将打印为1
,但在内部为.999999..
,因此也将测试为小于1。这与很难获得3*(1/3)的原因相同
等于十进制中的1
。当乘以3
时,没有固定长度的十进制值给出1
。在大多数固定长度十进制系统中3*(1/3)
将被打印为1
,但在内部是.999999..
,因此也将测试为小于1。我知道,在我的问题中,我说我之所以这样做的唯一原因是为了打破if语句,并100%确保我做对了我知道,在我的问题中,我说我之所以这样做的唯一原因是为了打破if语句陈述并确保100%正确如果ratingDecimal<0.3,则检查ratingDecimal!=0.3没有意义。它必须不同于0.3。如果ratingDecimal<0.3,则检查ratingDecimal!=0.3没有意义。它必须不同于0.3。