Перейти к основному содержимому
claw
am
tools
Инструменты
Документы
Daoark
EN
Главная
Главная
/
Calculadora
›
Главная
manifest.json
= '0' && c <= '9') { var d = code - 48; return d < base ? d : -1; } if (c >= 'a' && c <= 'z') { var d2 = code - 87; return d2 < base ? d2 : -1; } if (c >= 'A' && c <= 'Z') { var d3 = code - 55; return d3 < base ? d3 : -1; } return -1; } // 把输入按 fromBase 转成 BigInt(整数部分)+ 小数部分(字符串) function parseFromBase(s, fromBase) { s = s.toLowerCase().trim(); var neg = false; if (s[0] === '-') { neg = true; s = s.substring(1); } var dotIdx = s.indexOf('.'); var intPart = dotIdx < 0 ? s : s.substring(0, dotIdx); var fracPart = dotIdx < 0 ? '' : s.substring(dotIdx + 1); if (!intPart && !fracPart) throw new Error('空字符串'); // 整数部分 → BigInt var big = 0n; if (intPart) { var fromB = BigInt(fromBase); for (var i = 0; i < intPart.length; i++) { var d = isValidDigit(intPart[i], fromBase); if (d < 0) throw new Error('字符 "' + intPart[i] + '" 不合法 for base ' + fromBase); big = big * fromB + BigInt(d); } } // 小数部分 → 字符串(不转 BigInt,因为小数可能无限) if (fracPart) { for (var j = 0; j < fracPart.length; j++) { var d2 = isValidDigit(fracPart[j], fromBase); if (d2 < 0) throw new Error('字符 "' + fracPart[j] + '" 不合法 for base ' + fromBase); } } return { big: big, frac: fracPart, neg: neg, fromBase: fromBase }; } function bigToBase(big, toBase) { if (big === 0n) return '0'; var toB = BigInt(toBase); var out = ''; var n = big < 0n ? -big : big; while (n > 0n) { var d = Number(n % toB); var c = d < 10 ? String.fromCharCode(48 + d) : String.fromCharCode(87 + d); out = c + out; n = n / toB; } return out; } // 字符串小数部分 × toBase function mulStr(s, fromBase, toBase) { // 模拟:把 s 当成 fromBase 进制的小数,转为 toBase 进制的小数 // 方法:把 s 解析成 BigInt,除以 fromBase^len if (!s) return ''; var fromB = BigInt(fromBase); var toB = BigInt(toBase); var num = 0n; for (var i = 0; i < s.length; i++) { num = num * fromB + BigInt(isValidDigit(s[i], fromBase)); } var denom = 1n; for (var k = 0; k < s.length; k++) denom *= fromB; // 把 num/denom 转为 toBase 进制小数 var frac = ''; var max = 50; while (num > 0n && max-- > 0) { num *= toB; var digit = Number(num / denom); frac += digit < 10 ? String.fromCharCode(48 + digit) : String.fromCharCode(87 + digit); num -= BigInt(digit) * denom; } return frac; } function doProcess() { try { var textA = getVal('text-a').trim(); if (!textA) { showError('请输入'); return; } var fromBase = parseInt(getVal('from-base'), 10); var toBase = parseInt(getVal('to-base'), 10); var prec = parseInt(getVal('precision'), 10); if (!(fromBase >= 2 && fromBase <= 36)) { showError('源进制 2-36'); return; } if (!(toBase >= 2 && toBase <= 36)) { showError('目标进制 2-36'); return; } if (prec < 0 || prec > 20) { showError('精度 0-20'); return; } var p = parseFromBase(textA, fromBase); var intOut = bigToBase(p.big, toBase); var fracOut = p.frac ? mulStr(p.frac, fromBase, toBase) : ''; var out = (p.neg ? '-' : '') + intOut + (fracOut ? '.' + fracOut : ''); showResult(out, textA + ' (base ' + fromBase + ') → ' + out + ' (base ' + toBase + ')'); } catch (e) { showError('转换失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; }); })();