-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-1数字为负数一样进行初始化,否则,将其保持在1

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

这就是您需要更改的所有内容,正如您从这个示例中看到的那样,其中:

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

输出:

-1/2
1/2
于 2013-02-23T22:20:01.507 回答
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 回答
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
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 回答