elseif语句无效


elseif statement is not working?

我编写了一个基于分数部分值的四舍五入逻辑。当我执行这个代码时,elseif块不会被执行。这是我的代码

<?php
    function roundRating($rating)
   {
    if($rating>=5 && $rating<0){
             $rating=0;
         }
        $a=(int)$rating/1;
        $b= $rating-$a;
        if(($b>=.1) && ($b<=.2)){
            $b=0;
            $rating=$a;
        }
        elseif(($b>=.3 && $b<=.4)|| ($b>=.6 && $b<=.7)){
            $b=.5;
            $rating=$a+$b;
        }
        elseif(($b>=.8) && ($b<=.9)){
            $b=1;
            $rating=$a+$b;
            $a=$rating;
        }
        else{}

         return $rating;       
   }
  echo  roundRating(3.3);
?>

对于这个值3.3,输出应该是3.5。但目前它将返回传递值3.3,而不是3.5。请帮我找出上面代码中的问题。提前谢谢。

我已经完成了我自己版本的函数,它可能更干净,我认为会生成所需的输出:

 function roundRating($rating) {
    if( $rating > 5) {
          return 5; // Note: assuming the >5 case of 0 was a bug and it was meant to cap it to 5
    } elseif( $rating < 0 ) {
          return 0;
    }
    $number = floor($rating);
    $remainder =  $rating * 10 % 10;
    if( $remainder <= 2 ) {
      return $number;
    } elseif( $remainder >= 8 ) {
      return $number + 1;
    } else {
      return $number + 0.5;
    }
  }
  echo roundRating(3.4); // 3.5
  echo roundRating( 3.0) ; // 3
  echo roundRating( 6) ; // 5
  echo roundRating( 3.8) ; // 4

请按照下面给出的代码进行操作。我们有时会在浮点值比较中遇到问题。因此,指定小数点后我们将考虑的数字是有用的。在下面的代码中,b的值被指定为小数点后仅取3个数字。

有关详细信息,请访问:浮点数学是否破坏

要在线查看,请访问:在线检查

    function roundRating($rating)
   {
    if($rating>=5 && $rating<0){
             $rating=0;
         }
        $a=(int)$rating/1;
        $b= sprintf('%3f',$rating-$a);
        if(($b>=.1) && ($b<=.2)){
            $b=0;
            $rating=$a;
        }
        elseif(($b>=.3 && $b<=.4)|| ($b>=.6 && $b<=.7)){
            $b=.5;
            $rating=$a+$b;
        }
        elseif(($b>=.8) && ($b<=.9)){
            $b=1;
            $rating=$a+$b;
            $a=$rating;
        }
        else{}

        return $rating;       
   }
   echo roundRating(3.3); // 3.5
?>

用以下代码替换您的代码。

<?php
    function roundRating($rating)
    {
        if($rating >= 5 && $rating < 0){
            $rating=0;
        }
        else
        {
            $a=(int)$rating/1;
            $b= $rating-$a;
            echo $a ."</br>";
            echo $b."</br>";
            if(($b >= 0.1) && ($b <= 0.2)){
                $b=0;
                $rating=$a;
            }
            elseif(($b >=0.3 || $b<=0.4) && ($b>=0.6 || $b<=0.7)){
                $b=.5;
                $rating=$a+$b;
            }
            elseif(($b>=.8) || ($b<=.9)){
                $b=1;
                $rating=$a+$b;
                $a=$rating;
            }
            else{}
        }
        return $rating;       
    }
    echo  roundRating(3.3);
?>

在这里,我做了两个更改,第一个是添加其他条件,如果$rating不大于5或小于0,则您的评级计算工作。如果条件发生变化,则在下面给出的其他条件中排名第二。

elseif(($b >=0.3 || $b<=0.4) && ($b>=0.6 || $b<=0.7)){
           //echo "here";
            $b=.5;
            $rating=$a+$b;
        }

我希望它能帮助你。

浮点数字在C中具有隐藏/有限的精度,因此您不能将它们信任到最后一位。上有更多关于这方面的文章http://php.net/manual/en/language.types.float.php

如果你把它四舍五入到小数点后1位,你会得到3.5:

$b= round($rating-$a, 1);

开始于:

if($rating>=5 && $rating<0)

永远都是假的。variable不能同时大于5和小于0。

关于

elseif(($b>=.3 && $b<=.4)|| ($b>=.6 && $b<=.7)){
        $b=.5;
        $rating=$a+$b;
    } 

它与有什么实际区别

elseif(($b>=.3 && $b<=.7)){
        $b=.5;
        $rating=$a+$b;
    }

除非你写:

else{
     $rating+=some_value;// forthe inifinite number of values between .4 & .6?
}

关于,

elseif(($b>=.8) && ($b<=.9)){
        $b=1;
        $rating=$a+$b;
        $a=$rating; // This statement is redundant
    }

由于从函数返回$rating,因此$a=$rating;是多余的。

说了上面的话,我觉得下面的实现会简单得多,结果几乎和期望的一样:

<?php
function round_rating($rating){
    if($rating<0 || $rating>5){
        $rating=0;
        return $rating;
    }
    $t_rating=(int)$rating; //$t_rating short for trimmed_rating :)
    $dif=$rating-$t_rating; //$dif is the short for difference :)
    if($dif <= .2){
        return($t_rating);
    }
    elseif($dif <= .7){
        return((float)$t_rating+.5);
    }
    else{
        return((float)$t_rating+1); 
    }
} // round_rating function ends here :)
 /*Test time*/
 printf("Round rating for %0.2f : %0.2f'n",6,round_rating(6));
 printf("Round rating for %0.2f : %0.2f'n",0.2,round_rating(0.2));  
 printf("Round rating for %0.2f : %0.2f'n",1.4,round_rating(1.4));      
 printf("Round rating for %0.2f : %0.2f'n",2.8,round_rating(2.8));
 printf("Round rating for %0.2f : %0.2f'n",4.6,round_rating(4.6));
 printf("Round rating for %0.2f : %0.2f'n",-1,round_rating(-1));        
?>

输出:

Round rating for 6.00 : 0.00
Round rating for 0.20 : 0.00
Round rating for 1.40 : 1.50
Round rating for 2.80 : 3.00
Round rating for 4.60 : 4.50
Round rating for -1.00 : 0.00

感谢大家的回答。最后我得到了答案。这是我的答案。

function roundRating($rating)
   {
   if($rating>5 ){
        $rating=0;
        return $rating;   
    }
    elseif($rating<=0)
    {
        $x=0;
        return $rating;   
    }
    $a=(int)$rating/1;
    $b= $rating-$a;
    $b= (int)round(($b*10),0); 
      if($b<=2)
      {
          $rating=$a;
            return $rating;   
      }
      elseif($b>=3 && $b<=7){
          $rating=$a+.5;
            return $rating;   
      }
      elseif($b>=8){
          $rating=$a+1;
            return $rating;   
      }
      else{}
}

echo roundRating(3.2); //3
echo roundRating(3.3); //3.5
echo roundRating(3.7);  //3.5
echo roundRating(3.8); //4