5

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

在 ruby​​ 中,我们目前执行 Rational(1.333).rationalize(Rational(0.01)),它给我们 1 作为整数,1 作为分子,3 作为分母。

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

4

5 回答 5

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));
于 2013-10-09T00:49:13.210 回答
2

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

于 2013-10-09T00:02:52.443 回答
1

您可以使用.toFixed()获得一个四舍五入的、固定精度的版本,然后将 BigRational 应用于:

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

或者,.toPrecision()将给指定的有效数字位数一个数字。

参考: .toFixed() .toPrecision()

于 2013-10-09T00:03:34.370 回答
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) = 舍入 (10.35) = 10

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

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

于 2013-10-10T00:45:20.450 回答
-5

是时候清理你的数学了。这确实是小学数学,但有点容易忘记。为什么要 3 1/3?

您正在尝试将一个有理数(所有浮点数都是有理数)转换为另一个有理数(所有分数都是有理数)。

所以选择你的分母。一切由此而来!(减少到最低限度——除非你想让自己看起来像是从小学辍学的。)

于 2013-10-09T00:08:40.920 回答