我根据小数部分值写一个逻辑来舍入值。当我执行此代码时,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。请帮助我找出上面代码中的问题。提前致谢。
答案 0 :(得分:1)
我已经完成了我自己的功能版本,它可能更干净,我认为会产生所需的输出:
{{1}}
答案 1 :(得分:1)
请按照以下代码给出bellow.we有时候会面临浮动值比较的问题。因此,指定小数点后我们将考虑多少数字是有用的。在下面的代码中,b的值被指定为小数点后只需要3个数字。
详情请访问: is-floating-point-math-broken
要在线查询,请访问: Online check
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
?>
答案 2 :(得分:0)
浮点数在C中具有隐藏/有限精度 - 因此您无法将它们信任到最后一位数。在http://php.net/manual/en/language.types.float.php
上有更多关于此的文章如果你将它四舍五入到小数点后1位,你将获得3.5:
$b= round($rating-$a, 1);
答案 3 :(得分:0)
用以下代码替换您的代码。
<span class="nombre">
<span>Nombre</span>
<span><strong>lastname</strong></span>
</span>
这里我做了两次更改,首先添加其他条件,如果$ rating不大于5或小于0,则为您的评级计算工作;如果条件是下面给出的更改,则在您的其中一个中为第二个。
.username .nombre {width: 75px; display: inline-block; text-align: right; margin-right: 10px;}
.glyphicon { vertical-align: top; padding-top: 15px; }
.glyphicon:first-child { padding-top: 10px}
我希望它会对你有所帮助。
答案 4 :(得分:0)
首先:
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
答案 5 :(得分:0)
谢谢大家的回答。最后我得到了答案。这是我的答案。
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