版权声明:个人笔记,不喜勿喷 https://blog.csdn.net/qq_39571197/article/details/88684156
// utils.js
module.exports = {
isFloat(...numOrStrs) {
const POINT_REG = /\./;
return !!numOrStrs.find(item => POINT_REG.test(item));
},
fixLen(a, b, isRight0 = true) {
a += '', b += '';
let diff = a.length - b.length;
const fixStr = '0'.repeat(Math.abs(diff));
if (diff === 0) {
return [a, b];
}
if (isRight0) {
if (diff < 0) {
// b 长
return [fixStr + a, b];
} else {
// a 长
return [a, fixStr + b];
}
} else {
if (diff < 0) {
// b 长
return [a + fixStr, b];
} else {
// a 长
return [a, b + fixStr];
}
}
},
transToInt(num) {
num += '';
const pointIndex = num.indexOf('.');
const diff = num.length - 1 - pointIndex;
return {
move: diff,
value: num.replace(/\./, ''),
};
},
};
// 加法
const utils = require('./utils');
module.exports = add;
function add(a, b) {
a += '', b += '';
const isFloatMode = utils.isFloat(a, b);
if (!isFloatMode) {
return $add(a, b) * 1;
}
// 浮点数运算
const [intA, floatA] = a.split('.');
const [intB, floatB] = b.split('.');
let intResult = $add(intA, intB);
let floatResult = $add(floatA, floatB, false);
// 处理小数
const floatLenDiff = floatResult.length - Math.max(floatA.length, floatB.length);
if (floatLenDiff > 0) {
const _int = floatResult.slice(0, floatLenDiff), _float = floatResult.slice(floatLenDiff);
intResult = $add(intResult, _int);
floatResult = _float;
}
return (intResult + '.' + floatResult) * 1;
}
console.log(add(646.5541, 554.6469)); // 1201.201
console.log(add(0.1, 0.2)); // 0.3
console.log(add(15, 25)); // 40
function $add(a, b, isRight0 = true) {
[a, b] = utils.fixLen(a, b, isRight0);
let result = '';
let carryNum = 0;
for (let i = a.length - 1; i >= 0; i--) {
let _r = a[i] * 1 + b[i] * 1 + carryNum;
if (_r >= 10) {
carryNum = 1;
_r -= 10;
} else {
carryNum = 0;
}
result = _r + result;
}
if (carryNum === 1) {
result = '1' + result;
}
return result;
}
// 乘法
const utils = require('./utils');
const add = require('./add');
console.log(1)
function time(a, b) {
a += '', b += '';
let intRate = 1; // 放大倍率
if (utils.isFloat(a)) {
const info = utils.transToInt(a);
a = info.value;
intRate *= Math.pow(10, info.move);
}
if (utils.isFloat(b)) {
const info = utils.transToInt(b);
b = info.value;
intRate *= Math.pow(10, info.move);
}
let results = [];
let post = 0;
for (let i = b.length - 1; i >= 0; i-- , post++) {
results.push(singleTime(a, b[i]) + '0'.repeat(post));
}
let result = 0;
for (let i = 0; i < results.length; i++) {
result = add(result, results[i]);
}
return result / intRate;
}
console.log(time(199.9, 90.5)); // 18090.95
console.log(time(31231.00219, 515.55)); // 16101143.1790545
function singleTime(a, cur) {
let result = '';
let carryNum = 0;
for (let i = a.length - 1; i >= 0; i--) {
let _r = a[i] * cur + carryNum;
if (_r >= 10) {
carryNum = Math.floor(_r / 10);
_r %= 10;
} else {
carryNum = 0;
}
result = _r + result;
}
if (carryNum > 0) {
result = carryNum + result;
}
return result;
}