一. 问题描述 最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如: 0.1+0.2 == 0.30000000000000004 0.1 + 0.7 == 0.7999999999999999 7*0.8 == 5.6000000000000005 5.6/7 == 0.7999999999999999 二.解决方案 JS运算后都会有很小的误差. 不像.Net或者Java那样准确. 主要是JS重点不在运算上面,可是有时候项目一定要用到.想了一下大概有两种解决方案 A 方案一: 运算结果保留2-3位小数位数. 前端界面一般用到的运算比较少。精度要 在JavaScript中,浮点数运算时常会出现看似不准确的结果,这是因为JavaScript使用了IEEE 754标准来存储和处理浮点数,这个标准在处理某些特定的浮点数时会出现精度损失。例如,在上述问题中,`0.1 + 0.2` 不等于 `0.3`,而是等于 `0.30000000000000004`。类似的问题还存在于其他浮点数的加减乘除运算中。 对于这样的问题,有几种常见的解决方案: **方案一:保留小数位数** 一种简单但不一定完全精确的方法是限制运算结果的小数位数。这适用于精度要求不高的情况。例如,可以将结果四舍五入到两位或三位小数。在JavaScript中,可以使用`toFixed()`方法来实现这一点,如`result.toFixed(2)`。 ```javascript let result = (0.1 + 0.2).toFixed(2); ``` **方案二:转换为整数运算** 更精确的解决方案是将浮点数转换为整数进行运算,然后将结果转换回浮点数。这可以通过乘以10的适当幂(根据小数位数)来实现。例如: ```javascript let a = 0.1; let b = 0.2; let result = (a * 100 + b * 100) / 100; ``` 上述代码将`0.1`和`0.2`分别乘以100,再相加,最后除以100,以恢复原始的小数形式,从而避免精度问题。 **自定义JSMath库** 为了更方便地处理这类问题,可以创建一个自定义的JSMath库,它重写了基本的数学运算,如加、减、乘、除,以确保精确性。在提供的示例中,JSMath库创建了一个对象,通过`from`方法接受数值,然后使用整数运算处理浮点数。例如: ```javascript let JSMath = new JSMath(); let result = JSMath.from(0.1).add(JSMath.from(0.2)).value; ``` 在JSMath库的实现中,计算过程首先确定最大小数位数,然后将浮点数转换为具有相同小数位数的整数,执行运算,然后再转换回浮点数。这种方法可以有效避免由于浮点数表示不精确导致的错误。 JavaScript中的浮点数运算误差主要源于其内部的二进制表示方式,而通过限制小数位数、转换为整数运算或者使用自定义库,可以一定程度上解决这个问题。在实际应用中,应根据项目需求选择合适的策略,以确保计算的精确性和一致性。
- 粉丝: 9
- 资源: 933
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- AllSort(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
- 模拟qsort,改造冒泡排序使其能排序任意数据类型,即日常练习
- 数组经典习题之顺序排序和二分查找和冒泡排序
- 基于 Oops Framework 提供的游戏项目开发模板,项目中提供了最新版本 Cocos Creator 3.x 插件与游戏资源初始化通用逻辑
- live-ai这是一个深度学习的资料
- FeiQ.rar 局域网内通信服务软件
- 172.16.100.195
- 光储并网simulink仿真模型,直流微电网 光伏系统采用扰动观察法是实现mppt控制,储能可由单独蓄电池构成,也可由蓄电池和超级电容构成的混合储能系统,并采用lpf进行功率分配 并网采用pq控制
- python编写微信读取smart200plc的数据发送给微信联系人
- 光储并网VSG系统Matlab simulink仿真模型,附参考文献 系统前级直流部分包括光伏阵列、变器、储能系统和双向dcdc变器,后级交流子系统包括逆变器LC滤波器,交流负载 光储并网VSG系