当前位置: 首页 > news >正文

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

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

1. 加法运算

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. 减法运算

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. 乘法运算

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. 除法运算

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);
}

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

// 示例使用
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 实现除法运算,先获取两个数小数部分的位数,将它们转换为整数相除,再根据位数差异调整结果。

http://www.dtcms.com/a/503200.html

相关文章:

  • 性能优化:提升软件效率的实用指南
  • 【FPGA】设计流程——Veriolg输入
  • 公共交通安全再讨论
  • C++蓝桥杯之结构体10.15
  • 从原理到实战:Java 队列(Queue)指南
  • 【C++】用红黑树封装map与set
  • php网络公司网站源码网站建设与管理的体会
  • 做网站要先申请域名吗做彩铃的网站
  • 零基础做地方门户网站装修网名大全
  • Docker入门手册
  • 谷歌 Gemini 2.5 Flash Image 震撼升级图像编辑
  • Spring Boot 3零基础教程,WEB 开发 整合 Thymeleaf 笔记36
  • [go 面试] 并发与数据一致性:事务的保障
  • gitee——代码托管平台(进行托管所需的相关软件)
  • JavaWeb后端-Maven、单元测试
  • 微网站后台怎么注册有哪些公众号是小黄油的
  • 【SayCan】LLM+价值函数:以言为引,量力而行
  • 做亚马逊外国网站需要语言好吗大都会app约
  • DaVinci4.2.3 | 无限次AI图片生成,可以预制多种风格,提示限制清理数据重新进即可
  • Linux 配置双栈协议(IPv4 + IPv6)详解
  • JAVA全栈JVM篇————初识JVM
  • 在PyTorch中实现自定义损失函数
  • Hoeffding树:数据流挖掘中的高效分类算法详解
  • 深入解析Java并发基石AQS框架的设计哲学与实战应用
  • 爬虫+Docker:让你的爬虫项目一键部署、可移植
  • 微信网站设计模板下载不用建网站怎么做淘宝客
  • wordpress主题 外贸网站模板下载新品发布会流程
  • 数据结构----树
  • uni-app 入门学习教程,从入门到精通,uni-app组件的详细语法知识点与使用方法(5)
  • 桑基图、弦图、旭日图:如何表现复杂流向关系