我们需要将计算出的值(例如3.33333000540733337)转换为3 1/3。我试过的任何库如https://github.com/peterolson/BigRational.js都会将其转换为最准确的有理数,而我只关注近似有理数,到.01有效小数。
在ruby中,我们目前使用Rational(1.333)。理性化(Rational(0.01)),它给出1作为整数,1作为分子,3作为分母。
对可能有用的算法的任何想法都会很棒。
答案 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()
会为特定的有效位数提供一个数字。
答案 3 :(得分:0)
我会再试一次。大概你把这个问题标记为'数学'。那么让我们来看看数学。
您的混合部分的整个部分将是地板(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?
你试图将有理数(所有浮点数是有理数)转换为另一个有理数(所有分数都是有理数)。
所以选择你的分母。一切都来自于此! (减少到最低限度 - 除非你想看起来像你从小学退学。)