{% set meta={"title": "Fraction to base n", "desc": "Convert fractions to digit expansions in different bases"} %} {% extends "/_base.html" %} {% block head %} <script> const SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyz"; function getInputs() { const errorDiv = document.getElementById("error"); error.textContent = ""; const numer = parseInt(document.getElementById("numer").value); const denom = parseInt(document.getElementById("denom").value); const base = parseInt(document.getElementById("base").value); const digits = parseInt(document.getElementById("digits").value); if(isNaN(numer) || isNaN(denom) || isNaN (base) || isNaN(digits)) { errorDiv.textContent = "Error: inputs must be integers"; return; } const blockform = document.getElementById("blockform").checked; if(denom === 0) { errorDiv.textContent = "Error: denominator must be nonzero"; return; } if(base < 2) { errorDiv.textContent = "Error: base must be 2 or greater"; return; } if(!blockform && base > 36) { errorDiv.textContent = "Error: bases greater than 36 require block form"; return; } if(digits < 0) { errorDiv.textContent = "Error: digit count must be nonnegative"; return; } return [numer, denom, base, digits, blockform]; } function calc() { [numer, denom, base, digits, blockform] = getInputs(); console.log(numer, denom, base, digits, blockform); const sign = Math.sign(numer * denom); numer = Math.abs(numer); denom = Math.abs(denom); const intpart = Math.floor(numer / denom); const fracpart = numer % denom; // int part let intpartDigits = []; let num = intpart; while(num !== 0) { intpartDigits.push(num % base); num = Math.floor(num / base); } intpartDigits.reverse(); let fracpartDigits = []; num = fracpart; for(let i = 0; i < digits && num !== 0; i++) { num *= base; fracpartDigits.push(Math.floor(num / denom)); num %= denom } let result = (sign === -1 ? "-" : ""); if(blockform) { let intpartStr = intpartDigits.join(":"); if(intpartStr.length == 0) { intpartStr = "0"; } let fracpartStr = fracpartDigits.join(":") if(fracpartStr.length > 0) { fracpartStr = "." + fracpartStr + ":"; } result += intpartStr + fracpartStr; } else { let intpartStr = intpartDigits.map(x => SYMBOLS[x]).join(""); if(intpartStr.length == 0) { intpartStr = "0"; } let fracpartStr = fracpartDigits.map(x => SYMBOLS[x]).join("") if(fracpartStr.length > 0) { fracpartStr = "." + fracpartStr; } result += intpartStr + fracpartStr; } document.getElementById("result").textContent = result; } </script> {% endblock%} {% block content%} <div>Numerator: <input type="number" id="numer" /></div> <div>Denominator: <input type="number" id="denom" /></div> <div>Base: <input type="number" id="base" /></div> <div>Digits: <input type="number" id="digits" /></div> <div><input type="checkbox" id="blockform" /> Show block form</div> <div><input type="button" id="calc" value="Calculate" onclick="calc();" /></div> <div>Result: <span id="result" style="color: var(--accent-2);"></span></div> <div id="error" class="error"></div> {% endblock %}