四舍五入到最接近的分数(一半、四分之一等)


Rounding to nearest fraction (half, quarter, etc.)

因此,我需要创建以下函数,但如果没有复杂的数学,我的头脑无法在PHP中想到任何可能性。

  • 始终四舍五入至最接近的小数点(1.81=1.90,1.89=1.90,1.85=1.90)
  • 始终将四舍五入至最接近的小数点(1.81=1.80,1.89=1.80,1.85=1.80)
  • 始终四舍五入,最接近x.25/x.50/x.75/x.00(1.81=2,1.32=1.50)
  • 始终将向下取整至最接近的x.25/x.50/x.75/x.00(1.81=1.75,1.32=1.25)
  • 始终四舍五入到最接近的x.50/1(1.23=1.50,1.83=2)
  • 始终四舍五入到最接近的x.50/1(1.23=1,1.83=1.50)

我已经在谷歌上搜索了两个小时,唯一出现的是Excel论坛。用一些简单的PHP行可以吗?

由于您正在查找四分之一.00.25.50.75),请将您的数字乘以4,根据需要四舍五入到最接近的整数(floor如果向下,ceil如果向上),然后除以4。

1.32,下降到最近的第四位:

1.32*4=5.28
楼层(5.28)=5.00
5.00/4=1.25

同样的原理适用于任何其他分数,如三分之一八分之一.0.125.25.375.5.625.75.875)。例如:

1.77,最接近八分之一:

1.77*8=14.16
ceil(14.16)=15.00
15.00/8=1.875


只是为了好玩,你可以写一个这样的函数:

function floorToFraction($number, $denominator = 1)
{
    $x = $number * $denominator;
    $x = floor($x);
    $x = $x / $denominator;
    return $x;
}
echo floorToFraction(1.82);      // 1
echo floorToFraction(1.82, 2);   // 1.5
echo floorToFraction(1.82, 3);   // 1.6666666666667
echo floorToFraction(1.82, 4);   // 1.75
echo floorToFraction(1.82, 9);   // 1.7777777777778
echo floorToFraction(1.82, 25);  // 1.8

请注意,答案并不是真正的防水。由于我们在这里处理的是浮点数,所以不能保证当你用分母除以四舍五入的数字时,它会返回一个整齐的四舍五进的数字。它可能返回1.499999999999,而不是1.5。这就是浮点数的本质。

在从函数返回数字之前,需要进行另一轮运算。

万一有人像我一样从谷歌登陆这里:)

根据Excel中的mround()函数:

function MRound($num,$parts) {
    $res = $num * $parts;
    $res = round($res);
    return $res /$parts;
}
echo MRound(-1.38,4);//gives -1.5
echo MRound(-1.37,4);//gives -1.25
echo MRound(1.38,4);//gives 1.5
echo MRound(1.37,4);//gives 1.25

看看这里的示例#3,它是解决方案的一半-http://php.net/manual/en/function.round.php