Отказ от ответственности: Я не рекомендую вам делать это на самом деле.Однако вы можете реализовать свой собственный метод добавления, используя предварительно рассчитанную таблицу поиска и грубую реализацию «двоичного» сумматора (преобразованного в десятичную форму).Код ниже работает для вашего примера, но я не даю никаких гарантий, что он будет работать для любых общих случаев.
const lookupTable = Array(10).fill(0)
.map((_, i) => Array(10).fill(0)
.map((_, j) => [`${i},${j}`, i+j+'']))
.reduce((flatArr, innerArr) => [...flatArr, ...innerArr], [])
.reduce((lookupTable, [k, v]) => ({...lookupTable, [k]: v}), {})
const addDigits = (a, b) => {
const sum = lookupTable[`${a},${b}`];
if (sum.length === 2) return [sum[1], '1'];
else return [sum, '0'];
}
const strAdd = (a, b) => {
const add = ([aH, ...aT], [bH, ...bT], carryBit='0') => {
if (aH === undefined && aH === undefined) return '';
if (aH === undefined) return add([], bT, carryBit) + bH;
if (bH === undefined) return add(aT, [], carryBit) + aH;
if (aH === '.' || bH === '.') return add(aT, bT, carryBit) + '.';
const [partial_sum, partial_carryBit1] = addDigits(aH, bH);
const [sum, partial_carryBit2] = addDigits(partial_sum, carryBit);
const [newCarryBit] = addDigits(partial_carryBit1, partial_carryBit2);
return add(aT, bT, newCarryBit) + sum;
}
const [whole_a, decimal_a] = a.split('.');
const [whole_b, decimal_b] = b.split('.');
const wholeMaxLength = Math.max(whole_a.length, whole_b.length)+1;
const decimalMaxLength = Math.max((decimal_a || '0').length, (decimal_b || '0').length);
a = whole_a.padStart(wholeMaxLength, '0') + '.' + (decimal_a || '').padEnd(decimalMaxLength, '0');
b = whole_b.padStart(wholeMaxLength, '0') + '.' + (decimal_b || '').padEnd(decimalMaxLength, '0');
return add([...a].reverse(), [...b].reverse(), '0')
.replace(/^0+/, '') // remove leading 0
.replace(/0+$/, '') // remove trailing 0
.replace(/\.$/, '') // remove trailing .
}
const calc = (a, b, expected) => {
const result = strAdd(a, b);
console.log(result, result === expected);
}
calc('10.23', '25.69', '35.92');
calc('1', '2', '3');
calc('10.3', '2', '12.3');
calc('99999', '1.01', '100000.01');