将浮点数转换为javascript中的近似分数

时间:2013-10-08 23:55:25

标签: javascript math decimal fractions

我们需要将计算出的值(例如3.33333000540733337)转换为3 1/3。我试过的任何库如https://github.com/peterolson/BigRational.js都会将其转换为最准确的有理数,而我只关注近似有理数,到.01有效小数。

在ruby中,我们目前使用Rational(1.333)。理性化(Rational(0.01)),它给出1作为整数,1作为分子,3作为分母。

对可能有用的算法的任何想法都会很棒。

5 个答案:

答案 0 :(得分:5)

您可以使用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));

答案 1 :(得分:2)

在使用库之前使用.toFixed()方法。请参阅http://www.w3schools.com/jsref/jsref_tofixed.asp

答案 2 :(得分:1)

您可以使用.toFixed()获取四舍五入的固定精度版本,然后对其应用BigRational:

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

或者,.toPrecision()会为特定的有效位数提供一个数字。

参考: .toFixed() .toPrecision()

答案 3 :(得分: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. 您的混合部分的整个部分将是地板(rv / m)。小数部分将是(rv modulo 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

答案 4 :(得分:-5)

时间去除数学。这真的是小学数学,但这有点容易被遗忘。你为什么想要3 1/3?

你试图将有理数(所有浮点数是有理数)转换为另一个有理数(所有分数都是有理数)。

所以选择你的分母。一切都来自于此! (减少到最低限度 - 除非你想看起来像你从小学退学。)