JavaScript 实现高精度四则运算的完整代码示例

作者:代码拾荒

时间:2026-10-26

浏览:528

本文提供JavaScript中实现高精度除法、乘法、加法和减法的完整代码。针对JS浮点数运算存在的精度误差问题,通过字符串处理与指数运算校正小数位,确保计算结果精确。同时演示了如何扩展Number原型以简化调用方式,适用于金融计算等对精度有严格要求的场景。

文章目录

JavaScript高精度四则运算实现代码

以下是实现高精度四则运算的完整代码:

 
// 除法函数,用于获取精确的除法结果
// 说明:JavaScript原生除法在两个浮点数相除时会产生明显误差。此函数旨在返回精度较高的除法结果。
// 调用方式:accDiv(arg1, arg2)
// 返回值:arg1 除以 arg2 的精确结果
function accDiv(arg1, arg2) {
var t1 = 0, t2 = 0, r1, r2;
try { t1 = arg1.toString().split(".")[1].length } catch (e) {}
try { t2 = arg2.toString().split(".")[1].length } catch (e) {}
with (Math) {
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return (r1 / r2) * pow(10, t2 - t1);
} 
} 
// 为Number类型添加div方法,使调用更为便捷。
Number.prototype.div = function (arg) {
return accDiv(this, arg);
}; 
// 乘法函数,用于获取精确的乘法结果
// 说明:JavaScript原生乘法在两个浮点数相乘时会产生明显误差。此函数旨在返回精度较高的乘法结果。
// 调用方式:accMul(arg1, arg2)
// 返回值:arg1 乘以 arg2 的精确结果
function accMul(arg1, arg2) {
{ 
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
try { m += s1.split(".")[1].length } catch (e) {}
try { m += s2.split(".")[1].length } catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
} 
// 为Number类型添加mul方法,使调用更为便捷。
Number.prototype.mul = function (arg) {
return accMul(arg, this);
}; 
// 加法函数,用于获取精确的加法结果
// 说明:JavaScript原生加法在两个浮点数相加时会产生明显误差。此函数旨在返回精度较高的加法结果。
// 调用方式:accAdd(arg1, arg2)
// 返回值:arg1 加上 arg2 的精确结果
function accAdd(arg1, arg2) {
var r1, r2, m;
try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; }
try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; }
m = Math.pow(10, Math.max(r1, r2));
return (arg1 * m + arg2 * m) / m;
} 
// 为Number类型添加add方法,使调用更为便捷。
Number.prototype.add = function (arg) {
return accAdd(arg, this);
}; 
// 减法函数
function accSub(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
} 
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
} 
m = Math.pow(10, Math.max(r1, r2));
// last modify by deeka
// 动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg2 * m - arg1 * m) / m).toFixed(n);
} 
/// 给number类增加一个sub方法,使调用更为便捷
Number.prototype.sub = function (arg) {
return accSub(arg, this);
}; 

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章