我编写了一个基于分数部分值的四舍五入逻辑。当我执行这个代码时,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