JavaScript 基于 IEEE 754 标准处理浮点数,直接运算常出现精度丢失。本文提供一套完整的精确运算解决方案,通过字符串处理与位数对齐技术,分别实现了加法、减法、乘法和除法函数。代码涵盖整数与小数混合运算场景,并支持自定义保留小数位数,有效解决金融计算等对精度要求严格的业务需求。
JavaScript 精确计算背景与方案概述
前言
由于计算机内部采用浮点数格式存储数值,在执行常规数学运算时,结果往往存在精度误差。这种特性在处理涉及金额或高精度数据的数组计算时尤为棘手,因此需要采用特定的算法来实现精确的数值运算。
精确加法运算实现
首先介绍加法运算的实现逻辑(以两个数值相加为例)。
function add(arg1, arg2) {
arg1 = arg1.toString(), arg2 = arg2.toString(); // 将传入的数据转化为字符串
var arg1Arr = arg1.split("."), // 将小数的数据从小数点的位置拆开
arg2Arr = arg2.split("."),
d1 = arg1Arr.length == 2 ? arg1Arr[1] : "", // 获取第一个数的小数点的长度
d2 = arg2Arr.length == 2 ? arg2Arr[1] : ""; // 获取第二个数的小数点的长度
var maxLen = Math.max(d1.length, d2.length); // 获取小数点长度较大的值
var m = Math.pow(10, maxLen); // 这里表示10的小数点长度次方 也就是说如果小数点长度为2 m的值就是100 如果小数点长度是3 m的值就是1000如果不懂请自行查找api
var result = Number(((arg1 * m + arg2 * m) / m).toFixed(maxLen)); // 将小数转化为整数后相加在除掉两个数乘过的倍数然后去小数点较长的长度的小数位数
var d = arguments[2]; // 第三个参数用户可以自行决定是否要传递 用来定义要保留的小数长度
return typeof d === "number" ? Number((result).toFixed(d)) : result;
}
add(12.123, 12)
精确减法运算逻辑
接着是减法运算。其核心逻辑是将减法转化为加法,即一个数加上另一个数的负数,因此其处理流程与加法函数保持一致。
function sun(arg1, arg2) {
return add(arg1, -arg2)
}
精确乘法运算实现
随后讲解乘法运算的实现方式。
function mul(arg1, arg2) {
var r1 = arg1.toString(), // 将传入的数据转化为字符串
r2 = arg2.toString(),
m, resultVal, d = arguments[2];
m = (r1.split(".")[1] ? r1.split(".")[1].length : 0) + (r2.split(".")[1] ? r2.split(".")[1].length : 0); // 获取两个数字的小数位数的和
// 乘积的算法就是去掉小数点做整数相乘然后除去10的所有小数位的次方
resultVal = Number(r1.replace(".", "")) * Number(r2.replace(".", "")) / Math.pow(10, m);
return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}
精确除法运算逻辑
最后是除法运算。除法与乘法互为逆运算,其处理原理与乘法类似,此处不再赘述具体细节。
function div(arg1, arg2) {
var r1 = arg1.toString(),
r2 = arg2.toString(),
m, resultVal, d = arguments[2];
m = (r2.split(".")[1] ? r2.split(".")[1].length : 0) - (r1.split(".")[1] ? r1.split(".")[1].length : 0);
resultVal = Number(r1.replace(".", "")) / Number(r2.replace(".", "")) * Math.pow(10, m);
return typeof d !== "number" ? Number(resultVal) : Number(resultVal.toFixed(parseInt(d)));
}
总结
至此,关于 JavaScript 实现精确加减乘除运算的方法已介绍完毕。如需了解更多相关技术内容,可查阅本站往期文章或继续浏览后续内容,感谢大家的支持!