我有这个脚本将小数转换为分数:
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;
}
但是,经过一些测试后,它似乎不适用于负小数。为什么是这样?另外,允许它使用负小数的解决方案是什么?
答案 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;
}