我们需要将可能类似于 3.33333000540733337 的计算值转换为 3 1/3。我尝试过的任何库(例如https://github.com/peterolson/BigRational.js )都会将其转换为最准确的有理数,而我只关心近似有理数,即 0.01 有效小数。
在 ruby 中,我们目前执行 Rational(1.333).rationalize(Rational(0.01)),它给我们 1 作为整数,1 作为分子,3 作为分母。
对可能有帮助的算法的任何想法都会很棒。
我们需要将可能类似于 3.33333000540733337 的计算值转换为 3 1/3。我尝试过的任何库(例如https://github.com/peterolson/BigRational.js )都会将其转换为最准确的有理数,而我只关心近似有理数,即 0.01 有效小数。
在 ruby 中,我们目前执行 Rational(1.333).rationalize(Rational(0.01)),它给我们 1 作为整数,1 作为分子,3 作为分母。
对可能有帮助的算法的任何想法都会很棒。
您可以使用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));
.toFixed()在使用您的库之前使用该方法。请参阅http://www.w3schools.com/jsref/jsref_tofixed.asp。
您可以使用.toFixed()获得一个四舍五入的、固定精度的版本,然后将 BigRational 应用于:
var n = 3.33333000540733337;
m = n.toFixed(2); // 3.33
或者,.toPrecision()将给指定的有效数字位数一个数字。
我会再试一次。大概您将问题标记为“数学”。所以让我们看一下数学。
你的混合分数的整个部分将是地板(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
是时候清理你的数学了。这确实是小学数学,但有点容易忘记。为什么要 3 1/3?
您正在尝试将一个有理数(所有浮点数都是有理数)转换为另一个有理数(所有分数都是有理数)。
所以选择你的分母。一切由此而来!(减少到最低限度——除非你想让自己看起来像是从小学辍学的。)