1

私は任意の実数を取得し、UTF-8 文字セットで使用可能な最も近い分数を適切に使用して、最も近い数値を返したいと考えています。

0/4 = 0.00 =   # < .125
1/4 = 0.25 = ¼ # > .125 & < .375
2/4 = 0.50 = ½ # > .375 & < .625
3/4 = 0.75 = ¾ # > .625 & < .875
4/4 = 1.00 =   # > .875

そのタスクを実行するためにこの関数を作成しました:

function displayFraction($realNumber)
{
    if (!is_float($realNumber))
    {
        return $realNumber;
    }
    list($number, $decimal) = explode('.', $realNumber);
    $decimal = '.' . $decimal;
    switch($decimal)
    {
        case $decimal < 0.125:
            return $number;
        case $decimal > 0.125 && $decimal < 0.375:
            return $number . '¼'; # 188 ¼ &#188;
        case $decimal > 0.375 && $decimal < 0.625:
            return $number . '½'; # 189 ½ &#189;
        case $decimal > 0.625 && $decimal < 0.875:
            return $number . '¾'; # 190 ¾ &#190;
        case $decimal < 0.875:
            return ++$number;
    }
}

これを行うためのより良い/異なる方法は何ですか?

echo displayFraction(3.1) . PHP_EOL;      # Outputs: 3
echo displayFraction(3.141593) . PHP_EOL; # Outputs: 3¼
echo displayFraction(3.267432) . PHP_EOL; # Outputs: 3¼
echo displayFraction(3.38) . PHP_EOL;     # Outputs: 3½

私の心を広げてください!

4

3 に答える 3

2

分数を選択するために、静的にコンパイルされた検索アルゴリズムを実装しました。Unicode の小数部の数があまり変わらない限り (そうはなりません)、あなたが持っているものは問題ありません。進む。

ユニコードの分数が頻繁に変化する世界に住んでいた場合。次に、検索をハードコーディングからデータ駆動型に切り替える必要があります。分数の値とそれに相当するユニコードの表を用意するだけです。テーブルで最も近い分数を検索し、関連する Unicode 文字を使用します。

于 2010-03-15T18:56:46.207 に答える
2

10 進数が 0.125 から 0.875 の間の場合、「賢い」と (188 + (decimal-0.125) * 4) を取ることができますが、それは賢い IMO よりも難読化されます。そうは言っても、おそらく最後のケースは > 0.875 であり、< 0.875 ではありません。

于 2010-03-15T18:59:15.163 に答える
1

小数部分の存在に依存しないでください。

# Will generate a STRICT warning if $realNumber does not contain a full stop:
list($number, $decimal) = explode('.', $realNumber);

代わりにこれを試してください:

$integerPart = floor($realNumber);
$decimalPart = $realPart - $integerPart;

ここではスイッチを使用するのではなく、if ステートメントを使用する必要があります (動作しているように見えますが、実際$decimalには式の結果と比較しているため、たとえば 0 を入力すると予期しない結果が得られます$decimal < 0.125)。

if ($decimalPart <= 0.25) {
    # ...
} else if ($decimalPart <= 0.5) {
    # ...
} else if ...
于 2010-03-15T19:00:12.870 に答える