关于javascript数字精度丢失的解决办法

分析原因

众所周知,在JavaScript中计算两个十进制数的和,有时候会出现令人惊讶的结果,主要原因是计算机将数据存储为二进制所引起的,所以这并不是javascript存在的缺陷,而在其他语言中也有类似的问题。

例如下面的例子:

我们在计算 0.1 + 0.1 的到的结果是 0.2,但是计算 0.1 + 0.2 的结果并不是0.3,而是0.30000000000000004

我们在计算 1.2 - 1 的结果并不是0.2,而是0.19999999999999996

不过这并不是JavaScript独有的,其他编程语言也会存在同样的问题。

解决办法:我们可以使用toPrecision凑整后再使用parentFloat,比如计算1.6385000000000001

bash 复制代码
let parse = parseFloat(1.6385000000000001.toPrecision(12))
console.log(parse === 1.6385) // true

接下来我们封装成方法使用

bash 复制代码
/**
	@param: 浮点小数
	@precise: 转换后有几位数
*/
function precision(num, precise) {
  return parseFloat(num.toPrecision(precise));
}

precision(1.6385000000000001, 1) // 2
precision(1.6385000000000001, 2) // 1.6
precision(1.6385000000000001, 3) // 1.64

其原理就相当一数学中的四舍五入。

相关推荐
swipe1 小时前
从 0 到 1 理解 React 虚拟列表:定高、不定高与 Canvas 版本完整拆解
前端·javascript·面试
铁皮饭盒2 小时前
Bun执行python代码
前端·javascript·后端
zzzzzz3104 小时前
当甲方说'logo放大的同时再缩小一点'时,我用 AI 把这个需求做出来了
javascript·css·程序员
Hilaku4 小时前
Node.js 还能再战十年?给你一个不换引擎的理由
前端·javascript·程序员
weedsfly4 小时前
前端必知必会:从 IIFE 到 ESM,模块化到底在解决什么?
前端·javascript
渣波4 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
槑有老呆4 小时前
每次跟大模型聊天,都是一次「失忆」的 HTTP 请求
javascript
sarasuki4 小时前
彻底搞懂JS闭包:从作用域链、形成条件到优缺点
javascript
糖拌西瓜皮5 小时前
TypeScript 进阶:泛型、条件类型、类型守卫与装饰器
javascript·node.js
swipe18 小时前
从 0 到 1 实现大文件上传:分片、秒传、断点续传、暂停、重试与服务端合并
前端·javascript·面试