标签:const utils add let result return 好玩 进位 乘法
// 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;
}
标签:const,utils,add,let,result,return,好玩,进位,乘法 来源: https://blog.csdn.net/qq_39571197/article/details/88684156
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。