asFraction = (input) => {
let num, denom, whole;
if (Array.isArray(input)) {
num = input[0];
denom = input[1];
whole = Math.floor(num / denom);
num -= whole * denom;
} else {
const decimal = input % 1;
if (decimal === 0) return input;
whole = Math.floor(input);
const decStr = ("" + decimal).match(/(?<=\.)\d*/);
num = parseInt(decStr[0]);
denom = 10 ** decStr[0].length;
}
let lcf = 1;
while (lcf < Math.max(num, denom)) {
lcf++;
if (num % lcf === 0 && denom % lcf === 0) {
num = num / lcf;
denom = denom / lcf;
lcf = 1;
}
}
return `${whole}${num !== 0 ? ` ${num}/${denom}` : ""}`;
}