我有一个基于用户提交的基本五星评级系统。根据评级显示特定图像。
$user_rating
包含小数点后一位的评级编号。
有带有的"星形"图像
0.5、1.0、1.5、2.0、2.5、3.0、3.5、4.0、4.5、5.0
在文件名中。
我需要$user_rating中包含的任何数字都四舍五入到上面最接近的值,并存储在新的变量$star_rating
中。这些数字永远不能四舍五入。即使$user_rating
是4.9,$star_rating
也应该是4.5。
有人能帮我做到这一点吗?感谢
EDIT-使用此选项,但仅返回原始值-在本例中为3.8
$star_rating = $user_rating;
function roundToHalf($star_rating) {
$temp = $star_rating * 10;
$remainder = $star_rating % 5;
return ($temp - $remainder) / 10;
}
<?php
function roundRating($rating, array $ratings)
{
if (in_array($rating, $ratings))
{
return $rating;
}
foreach($ratings as $key => $value)
{
if ($value > $rating)
{
return $ratings[($key - 1)];
}
}
return FALSE;
}
$ratings = array(0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0);
$rating = 4.3;
if ($rate = roundRating($rating, $ratings))
echo sprintf('%.01f', $rate);
演示:http://3v4l.org/BRBne
一种简单的方法:
function roundToHalf($star_rating) {
return floor( $star_rating * 2 ) / 2;
}
这是有效的,因为你正在寻找可以被.5整除的值。结果是一个浮动。我认为你最好得到一个数值,以防你想把它用于数学目的。让您的显示代码根据需要对其进行格式化。
function roundDownToHalf($number) {
$remainder = ($number * 10) % 10;
$half = $remainder >= 5 ? 0.5 : 0;
$value = floatval(intval($number) + $half);
return number_format($value, 1, '.', '');
}
define("ENDL", "'n");
print roundDownToHalf(4.9) . ENDL;
print roundDownToHalf(4.5) . ENDL;
print roundDownToHalf(3.8) . ENDL;
print roundDownToHalf(2.3) . ENDL;
print roundDownToHalf(1.0) . ENDL;
print roundDownToHalf(0.6) . ENDL;
输出
4.5
4.5
3.5
2.0
1.0
0.5
一体化紧凑功能:
function roundDownToHalf($n) {
return number_format(floatval(intval($n)+((($n*10)%10)>=5?.5:0)),1,'.','');
}
乘以10使其成为整数,然后使用模运算符"%"去除余数。然后除以10,使其回到小数点。
function roundToHalf($number) {
$temp = intval($number * 10);
$remainder = $temp % 5;
return ($temp - $remainder) / 10;
}