2013-10-08 35 views
3

我們需要將可能類似於3.33333000540733337的計算值轉換爲3 1/3。我試過的任何庫如https://github.com/peterolson/BigRational.js都會將其轉換爲最準確的有理數,而我只關心近似有理數,重要的小數.01。將浮點數轉換爲javascript中的近似分數

在ruby中,我們目前使用Rational(1.333).rationalize(Rational(0.01)),它給出了1作爲整數,1作爲分子,3作爲分母。

對算法的任何想法可能會有所幫助。

+1

[ 「如何浮子轉換爲人類可讀的級分?」](HTTP:// stackoverflow.com/questions/95727/how-to-convert-floats-to-human-readable-fractions)和s特別是[這個面向JavaScript的答案](http://stackoverflow.com/a/681534/1934901) – tehsockz

+0

請記住,將'3.33333000540733337'轉換爲有理數「.01重要小數」將產生'3 33/100 ',而不是'3 1/3'。 –

+0

Peter yep,我們真的需要一個減少的近似分數。 – dstarh

回答

4

您可以使用https://github.com/peterolson/BigRational.js庫使用這樣的函數:

function rationalize(rational, epsilon) { 
    var denominator = 0; 
    var numerator; 
    var error; 

    do { 
     denominator++; 
     numerator = Math.round((rational.numerator * denominator)/rational.denominator); 
     error = Math.abs(rational.minus(numerator/denominator)); 
    } while (error > epsilon); 
    return bigRat(numerator, denominator); 
} 

它會返回一個bigRat對象。你可以檢查你的例子:

console.log(rationalize(bigRat(3.33333000540733337),0.01)); 
+0

謝謝,這似乎可以做到這一點,我將不得不寫一些比較測試,看看它是否符合我們從ruby中獲得的結果。 – dstarh

+0

這隻適用於JavaScript'Number'類型範圍內的分子和分母,這可能或可能不夠。如果您需要保留任意長度的分子和分母,您應該使用BigRat方法,例如'numerator = BigRat(rational.numerator.times(分母))。over(rational.denominator).round()'等等。 –

+0

@PeterOlson很有可能我們會處理的數量足夠小,可以放在標準的廚房食譜中,所以我懷疑我們是否會處理數字處理的範圍,至少在數字的左邊十進制,並且假設我們試圖在某種意義上使小數右邊的數字不那麼精確,我認爲這應該是確定的。 – dstarh

1

你可以使用.toFixed()得到一個圓,固定精度版本,然後應用BigRational到:

var n = 3.33333000540733337; 
m = n.toFixed(2);  // 3.33 

另外,.toPrecision()會給一個數字的顯著位數specificied數。

參考: .toFixed() .toPrecision()

-5

時間重溫你的數學。這真是小學數學,但這有點容易被人遺忘。你爲什麼要3 1/3?

您試圖將有理數(所有浮點數都是有理數)轉換爲另一個有理數(所有分數都是有理數)。

所以選擇你的分母。一切都源於此! (減少到最低條款 - 除非你想看起來像你放棄了小學。)

+1

我們正在顯示食譜數據和從3湯匙麪粉轉換成3 1/3杯麪粉。換算係數都是以克爲單位的,所以我們知道一個非常精確的數字,但需要一個更加近似的值。因此需要知道3 1/3而不是3.33333333334或類似 – dstarh

+0

您錯過了這一點!爲什麼3/3(10/3)而不是3.25(13/4),3.5(7/2)或3.4(17/5)?或3.3(330/100降至33/10)? –

+1

,因爲我們正在打印食譜,而且我們需要通用測量結果而不是「過於精確」的任何結果 – dstarh

0

我會再試一次。大概你把問題標記爲「數學」。所以讓我們看看數學。

  1. 分數是有理數。
  2. 有理數是n除以m(n/m)的所有形式,其中n和m是整數且m不爲零。
  3. 你想要一個「混合分數」。
  4. 在決定分母(m)之前,您不能指望「舍入到最接近的分數」,全部或混合。如果你選擇m = 100,那麼你可以四捨五入到最接近的100。如果你選擇1,那麼你可以四捨五入到最接近的整數。 2到最近的一半,等等。
  5. 既然您已經選擇了分母,那麼我們稱之爲m,然後將您的值(v)乘以m。
  6. 將結果舍入爲最接近的整數,稱之爲rv。
  7. 您的混合分數的整個部分將是floor(rv/m)。小數部分將是(rv模m)/ m (模意味着首先按秒除,剩餘部分作爲結果)

    示例v = 3.45。

    要將其舍入到最接近的1/3,所以M = 3

    RV =舍入到最近的整數(3.45 * 3)= ROUND(10.35)= 10

    整個部分=地板(10/3)= 3

    小數部分=(10模3)/ 3 = 1/3