【问题标题】:Rounding to nearest fraction (half, quarter, etc.)四舍五入到最接近的分数(一半、四分之一等)
【发布时间】:2016-09-04 15:38:36
【问题描述】:

所以,我需要创建以下函数,但如果没有复杂的数学,我的头脑无法想到 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 行来实现?

【问题讨论】:

  • 在 PHP.net 中寻找 round, ceil...
  • 我知道可以使用 round 和 ceil 但我无法以某种方式创建函数。
  • 2 小时的谷歌搜索本可以编写一些可能复杂但有效的算法
  • 这闻起来像作业......
  • @Wiseguy 你是对的。

标签: php rounding printf floor ceil


【解决方案1】:

由于您正在寻找 四分之二.00.25.50.75),请将您的数字乘以 4,然后根据需要四舍五入到最接近的整数(@ 987654326@ 如果下降,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

【讨论】:

  • 你们是我的英雄。谢谢。 (除了现在作为答案,我不知道我必须选择哪一个)。
  • 我会选择实际包含解决方案代码的答案,而不仅仅是其他地方的链接。或者您可以接受最先发布的那个。
  • 我希望我能给你数百个赞!
  • 对于现在正在研究此问题的任何人:只需使用 PHP 的 round function
  • @James 单独使用 round() 并不能解决 OPs 问题
【解决方案2】:

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

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

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

【讨论】:

  • 介意添加一个例子吗?
  • @Simon round(round(2.24 * 4) / 4, 2): 内轮函数使它捕捉到最接近的整数。除法会导致奇怪的浮点数,因此外圆函数将其四舍五入到小数点后 2 位。
  • @Fx32 你的小 sn-p 工作得很好——也许你应该提到根据需要更改位置(例如:round(round(2.24 * 8) / 8, 3) 以获得正确的结果,例如 .125、.875 转换为最接近的 1/8 分数英寸。
【解决方案3】:

根据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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 你们是我的英雄。谢谢。 (除了现在作为答案,我不知道我必须选择哪一个)。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多