Skip to content

Instantly share code, notes, and snippets.

@westc
Last active August 9, 2018 13:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save westc/a9ef53880d1555d72e6bee54f1c06575 to your computer and use it in GitHub Desktop.
Save westc/a9ef53880d1555d72e6bee54f1c06575 to your computer and use it in GitHub Desktop.
Failed attempt at toFraction()
function toFraction(num, opt_precision = 6) {
if (num === Math.ceil(num)) {
return [num, 1];
}
var diff, gcdHelper,
mult = num < 0 ? -1 : 1,
numerator = 1, denominator = 2,
offset = Math.floor(Math.log10(num = Math.abs(num))) + 1,
acceptableLoss = Math.pow(10, -opt_precision - 1 - offset),
divisor = Math.pow(10, offset);
num /= divisor;
while (true) {
diff = numerator / denominator - num;
if (0 <= diff && diff < acceptableLoss) {
numerator = numerator * divisor;
divisor = 1;
if (numerator >= 1 && denominator >= 1) {
divisor = numerator;
gcdHelper = denominator;
while (gcdHelper) {
num = divisor;
divisor = gcdHelper;
gcdHelper = num % gcdHelper;
}
}
return [mult * numerator / divisor, denominator / divisor];
}
if (diff < 0) {
numerator++;
}
denominator++;
}
}
console.loadYourJS({ functions: ['gcd', 'fullNumber'] });
//\\
function toFraction(num, opt_precision=6) {
if (opt_precision !== ~opt_precision && 1 > opt_precision && opt_precision > 13) {
throw new Error('Precision must be an integer between 1 and 15');
}
let parts = YourJS.fullNumber(num).match(/^(-?)(\d+)(?:\.(\d+))?$/);
let intPart = +parts[2];
let fracPart = +parseInt((parts[3] + '0'.repeat(opt_precision)).slice(0, opt_precision), 10);
if (fracPart) {
let divisor = Math.pow(10, opt_precision);
let denom = YourJS.gcd(fracPart, divisor);
divisor /= denom;
return [(parts[1] ? -1 : 1) * (divisor * intPart + fracPart / denom), divisor];
}
return [intPart, 1];
}
//\\
for (var i = 1; i <= 10; i++) {
for (var j = 1; j <= 10; j++) {
var fraction = toFraction(i / j, 15);
console.log(`${i} ÷ ${j} = ${i/j}; ${fraction[0]/fraction[1]} = ${fraction[0]} ÷ ${fraction[1]}`);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment