十进制到分数不适用于负数

时间:2013-02-23 22:15:37

标签: php decimal fractions

我有这个脚本将小数转换为分数:

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 个答案:

答案 0 :(得分:1)

如果数字为负数,则需要将$numerator初始化为-1,否则,请将其保留为1

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

这就是你需要改变的全部内容,正如你在this example看到的那样:

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

输出:

-1/2
1/2

答案 1 :(得分:0)

由于你的for循环中的逻辑设置方式,它可能不起作用。我要做的是检查函数开头的数字是否为负数。如果是的话,我会设置一个标志来提醒函数它原来是负数,然后我会翻转传入的$数字的符号。然后,在返回之前,我会检查我的标志是否已设置,如果是,我只是反转返回值。

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; 
}

答案 2 :(得分: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;
}

答案 3 :(得分: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; 
}