【问题】javascript计算丢失精度解决方案

简介: 1、问题描述:两个有限的数字相减得到小数点后面类似00000000000001,69999999999999之类的数。像下面这样0.1 + 0.2没有返回0.3,反而返回0.30000000000000004。原因是因为计算机把数字转成二进制计算再将计算转成十进制的这个过程出现的计算误差。不仅仅是JavaScript会出现这个问题,其他语言也会有。不过解决思路都是一样的

1、问题描述:


两个有限的数字相减得到小数点后面类似00000000000001,69999999999999之类的数。像下面这样0.1 + 0.2没有返回0.3,反而返回0.30000000000000004。原因是因为计算机把数字转成二进制计算再将计算转成十进制的这个过程出现的计算误差。不仅仅是JavaScript会出现这个问题,其他语言也会有。不过解决思路都是一样的


0.1 + 0.2
 => 0.30000000000000004


2、问题解决


下面是用JavaScript方法解决,其他语言的解决思路都是一样的


(1)保留4位小数,小数不足4位不会用0补齐


0.1 + 0.2 
=> 0.30000000000000004
//调整成
parseInt((0.1 + 0.2)*10000)/parseInt(10000)
=> 0.3


(2)保留四舍五入后的5位小数,小数不足5位用0补齐


0.012 * 0.06
 => 0.0007199999999999999
//调整成
parseInt(0.012 * 0.06*1000000)/parseInt(1000000).toFixed(5)
=> 0.0007
目录
相关文章
|
18天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
18天前
|
JavaScript 前端开发 大数据
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
|
3月前
|
JavaScript
|
3月前
|
存储 移动开发 JavaScript
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(1)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(1)
49 0
N..
|
1月前
|
缓存 JavaScript 前端开发
Vue.js的计算属性
Vue.js的计算属性
N..
11 2
|
2月前
|
JavaScript 前端开发
JavaScript 计算时间差并格式化输出
JavaScript 计算时间差并格式化输出
19 0
|
2月前
|
前端开发 JavaScript
前端JavaScript中异步的终极解决方案:async/await
在深入讨论 async/await 之前,我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是单线程的,也就是说在任何给定的时间点,只能执行一个操作。然而,对于需要大量时间的操作(例如从服务器获取数据),如果没有适当的管理机制,这种单线程特性可能会导致应用程序的阻塞。为了解决这个问题,JavaScript 引入了回调函数和后来的 Promise,用来管理这些异步操作。
|
3月前
|
存储 自然语言处理 JavaScript
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(4)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(4)
48 0
|
3月前
|
存储 JavaScript 前端开发
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(3)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(3)
67 0
|
3月前
|
存储 监控 JavaScript
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(2)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(2)
41 1