-1

小数を分数に変換する次のスクリプトがあります。

function toFraction($number){ 
    $numerator = 1; 
    $denominator = 0; 
    for(; $numerator < 1000; $numerator++){ 
        $temp = $numerator / $number; 
        if(ceil($temp) - $temp == 0){ 
            $denominator = $temp; 
            break; 
        } 
    } 
    return ($denominator > 0) ? $numerator . '/' . $denominator : false; 
}

ただし、いくつかのテストの後、負の小数では機能しないようです。どうしてこれなの?また、負の小数で動作させるための解決策は何ですか?

4

4 に答える 4

1

数値が負であるかのように初期化する必要があります。それ以外の場合は、そのままにして$numeratorおきます。-11

$numerator = $number < 0 ? -1 : 1;

この例からわかるように、変更する必要があるのはこれだけです。

echo toFraction( -0.5) . "\n" . toFraction( .5);

出力:

-1/2
1/2
于 2013-02-23T22:20:01.507 に答える
0
function toFraction($number)
{ 
    $minus = ($number < 0) ? '-' : '';
    $number = ($number < 0) ? ($number * -1) : $number;
    $numerator = 1; 
    $denominator = 0; 
    for(; $numerator < 1000; $numerator++)
    { 
        $temp = $numerator / $number; 
        if(ceil($temp) - $temp == 0)
        { 
            $denominator = $temp; 
            break; 
        } 
    } 
    return ($denominator > 0) ? $minus . $numerator . '/' . $denominator : false; 
}
于 2013-02-23T22:33:13.623 に答える
0
function gcd($a, $b) {
if ($a == 0 || $b == 0)
    return abs(max(abs($a), abs($b)));
$r = $a % $b;
return ($r != 0) ? gcd($b, $r) : abs($b);
}
function toFraction($number){
$up = $number;
$down = 1;
while(floor($up) != $up){
$up *= 10;
$down *= 10;
}
$gcd = gcd($up,$down);
$_up = $up / $gcd;
$_down = $down / $gcd;
return $_up . '/' . $_down;
}
于 2013-02-23T22:27:50.007 に答える
0

for ループでのロジックの設定方法が原因で、おそらく機能しません。私がすることは、関数の先頭で数値が負かどうかを確認することです。そうである場合は、フラグを設定して、元は負であったことを関数に思い出させてから、着信 $number の符号を反転させます。次に、戻る直前に、フラグが設定されているかどうかを確認し、設定されている場合は、戻り値を単純に反転します。

function toFraction($number){ 
    if ($number < 0) {
        $number *= -1;
        $isInverted = true;
    }

    $numerator = 1; 
    $denominator = 0; 
    for(; $numerator < 1000; $numerator++){ 
        $temp = $numerator / $number; 
        if(ceil($temp) - $temp == 0){ 
            $denominator = $temp; 
            break; 
        } 
    } 

    if ($isInverted)
        $numerator *= -1;

    return ($denominator > 0) ? $numerator . '/' . $denominator : false; 
}
于 2013-02-23T22:19:33.813 に答える