使用PHP对数字进行四舍五入以设置点


Rounding down numbers to set points with PHP

我有一个基于用户提交的基本五星评级系统。根据评级显示特定图像。

$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;
 }