web-dev-qa-db-ja.com

最も近い端数への丸め(半分、四半期など)

したがって、次の関数を作成する必要がありますが、頭の中では複雑な数学なしで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のいくつかの単純な行で可能ですか?

31
user1649331

あなたが探しているのでfourths.00.25.50.75)、数値に4を掛け、必要に応じて最も近い整数に丸め(ダウンの場合はfloor、アップの場合はceil)、4で除算します。

1.32、最も近い4番目まで

1.32 * 4 = 5.28
floor(5.28)= 5.00
5.00/4 = 1.25

thirdsまたはeighths(など) .0.125.25.375.5.625.75.875)。例えば:

1.77、8桁まで

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
91
Wiseguy

答えは本当に水密ではないことに注意してください。ここでは浮動小数点数を扱っているため、丸めた数を分母で除算すると、きれいに丸められた数が返されるとは限りません。 1.5ではなく1.499999999999を返す場合があります。それは浮動小数点数の性質です。

関数から数値を返す前に、別のラウンドが必要です。

私がしたように誰かがグーグルからここに着いた場合に備えて:)

4
Bart Guliker

ここの例#3を見てください。これはあなたの解決策の半分です- http://php.net/manual/en/function.round.php

2
Catfish

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
1
Aryeh Beitz