2013-02-23 55 views
-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; 
} 

然而,一些測試後,現在看來似乎並不爲負小數工作。爲什麼是這樣?另外,有什麼解決方案可以讓它使用負數小數?

+0

請不要[重新提交了同樣的問題(http://stackoverflow.com/questions/15046135/php-decimal-to-fraction-script-issue),但編輯當前的一個。此外,如此快速地刪除您的問題可能會導致自動禁止問題。只是一個領導和一個請求。 – Daedalus 2013-02-23 22:18:58

+0

僅供參考,此函數不適用於大於4位數的小數,因爲'$ numerator'循環的運行範圍是從0到1000。 – nickb 2013-02-23 22:25:25

回答

0

它可能不起作用,因爲你的邏輯在你的循環中設置的方式。我會做的是做一個檢查,看看你的函數開頭的數字是否定的。如果是這樣,我會設置一個標誌來提醒函數它最初是否定的,然後我會翻轉傳入$數字的符號。然後,在返回之前,我會檢查是否設置了我的標誌,如果是,我會簡單地反轉返回值。

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

需要初始化$numerator作爲-1如果數字爲負,否則,保持在1

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

這就是你需要改變,因爲你可以從this example,在此看:

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

輸出:

-1/2 
1/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; 
} 
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; 
}