js封装一个双精度算法实现

在 JavaScript 中,由于浮点数在计算机中的存储机制问题,进行双精度浮点数运算时可能会出现精度丢失的情况,比如 0.1 + 0.2 并不等于 0.3。下面是封装的一些常见双精度算法函数,用于解决加、减、乘、除运算中的精度问题:

1. 加法运算

javascript 复制代码
function accAdd(arg1, arg2) {
    let 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;
}

2. 减法运算

javascript 复制代码
function accSub(arg1, arg2) {
    let 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));
    n = (r1 >= r2)? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

3. 乘法运算

javascript 复制代码
function accMul(arg1, arg2) {
    let 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);
}

4. 除法运算

javascript 复制代码
function accDiv(arg1, arg2) {
    let t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
}

你可以按照以下方式使用这些函数:

javascript 复制代码
// 示例使用
console.log(accAdd(0.1, 0.2)); 
console.log(accSub(0.3, 0.1)); 
console.log(accMul(0.2, 0.3)); 
console.log(accDiv(0.6, 0.2)); 

上述代码中,accAdd 实现了双精度浮点数的加法,通过获取两个数小数部分的位数,将它们转换为整数进行加法运算,再将结果转换回浮点数;accSub 实现减法,逻辑和加法类似,最后根据小数位数较多的那个数来保留结果的小数位数;accMul 用于乘法运算,先统计两个数小数部分的总位数,将两个数转换为整数相乘后再除以对应的倍数得到结果;accDiv 实现除法运算,先获取两个数小数部分的位数,将它们转换为整数相除,再根据位数差异调整结果。

相关推荐
_OP_CHEN1 分钟前
【从零开始的Qt开发指南】(二十二)Qt 音视频开发宝典:从音频播放到视频播放器的实战全攻略
开发语言·c++·qt·音视频·前端开发·客户端开发·gui开发
FAFU_kyp1 分钟前
Rust 字符串与切片
开发语言·后端·rust
oioihoii5 分钟前
从C++到C#的转型完全指南
开发语言·c++·c#
NEXT068 分钟前
CSS 选择器深度实战:从“个十百千”权重法到零 DOM 动画的降维打击
前端·css
Ashley_Amanda8 分钟前
Python入门知识点梳理
开发语言·windows·python
区区一散修10 分钟前
Java进阶 6. 集合
java·开发语言
Mapmost13 分钟前
防患未“燃”:掌握森林火灾仿真分析,精准把控火势蔓延趋势
前端
半世轮回半世寻16 分钟前
前端开发里最常用的5种本地存储
前端·javascript
OpenTiny社区18 分钟前
TinyPro v1.4.0 正式发布:支持 Spring Boot、移动端适配、新增卡片列表和高级表单页面
java·前端·spring boot·后端·开源·opentiny
爱上妖精的尾巴21 分钟前
7-9 WPS JS宏 对象使用实例6:按条件读取多表再拆成多表
前端·javascript·wps·jsa