44

因此,我需要创建以下函数,但如果没有复杂的数学,我的头脑无法想到 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)

我已经在 Google 上搜索了 2 个小时,唯一出现的就是 Excel 论坛。是否可以使用一些简单的 PHP 行?

4

4 回答 4

122

由于您正在寻找四分之二.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
于 2013-02-15T21:19:25.190 回答
4

请注意,答案并不是真的水密。由于我们在这里处理浮点数,因此不能保证当您将舍入数除以分母时,它会返回一个整齐的整数。它可能返回 1.499999999999 而不是 1.5。这是浮点数的本质。

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

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

于 2015-03-11T10:45:03.930 回答
4

根据mround()Excel中的函数:

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
于 2016-09-04T07:38:36.190 回答
2

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

于 2013-02-15T21:15:27.513 回答