Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • CSS

  • JavaScript

    • 兼容ie7的水平无限滚动
    • 节流防抖
    • 数组乱序
    • 开启全屏
    • 数据类型
    • 变量提升
    • this调用指向
    • 原型及原型扩展
    • js获取元素属性精度问题
    • setTimeout和setInterval
    • 数组判断
    • dom节点添加或插入元素
    • var、let和const的区别
    • 判断ellipsis是否省略生效
    • 使用ResizeObserver监听元素size变化
    • js自定义事件
    • use strict详解
    • 私有属性
    • js实现类的方式
    • call和apply的理解和使用
    • js失焦和点击事件顺序冲突
    • js中不常见但非常实用的运算符
    • for of和for in的区别
    • defer和async的区别
    • promise值穿透
    • js为什么会出现数字精确度丢失
    • js禁用F12开发者模式
    • 使用scrollTop和scrollTo滚动到目标位置
    • js实现打字机效果
    • 多种方式实现数组去重
    • 替换使用setTimeout
    • encodeURI和encodeURIComponent的区别
    • canvas实现弹跳小球
    • js实现跨标签页通信
    • 事件循环与微任务、宏任务
    • 浏览器存储数据方式
    • 常见的meta元数据使用
    • 使用InterSectionObserver判断元素区域(chatGPT)
  • 工具

  • Vue

  • antdv踩坑记录

  • Vue3

  • 前端
  • JavaScript
kros
2024-05-08

js为什么会出现数字精确度丢失

在JavaScript中,精度丢失通常是由于JavaScript数字类型的限制导致的。JavaScript使用IEEE 754双精度64位二进制格式来表示数字(即Number类型),这导致了两个主要的精度问题:

# 有限的精度范围

Number类型能表示的最小值和最大值是有限的。对于非常小或非常大的数值,可能会发生精度丢失。js 的 number 类型的最大值是 9007199254740992,这个值是 16 位。如果超过这个值,js 会出现不精确的现象。

console.log(9999999999999999 == 10000000000000000) // true
1

# 二进制浮点数表示

由于计算机使用二进制系统,而JavaScript的数字类型是基于二进制浮点数,所以十进制小数在转换为二进制浮点数时可能会有近似值。这意味着一些十进制小数无法精确地表示为二进制浮点数,从而导致精度丢失。 比如:0.1 + 0.2 十进制0.1 对应二进制0.000110011001100110011001100... 十进制0.2 转换为二进制同样是无限循环的:.00110011001100110011001100... 由于计算机不能存储无限循环的小数,它们使用最接近的有限位数的二进制小数来近似表示。当你对这些近似值进行计算时,误差会累积,导致最终结果与预期的精确值不符。

console.log(0.1 + 0.2) // 0.30000000000000004
1

只有x/2^n的数可以被精确表示,其它的小数都是近似数

提示

为什么在控制台直接console.log(0.2)会输出0.2而不是一个近似数呢?

虽然JavaScript使用IEEE 754标准来表示浮点数,它在内部存储浮点数的方式可能会导致一些精度问题,但在大多数情况下,JavaScript会尽量以最接近原始输入的方式显示浮点数。

# 解决方式

  • 将小数转化成整数计算
  • 借助js提供的静态值Number.EPSILON判断是否相等,只要差值小于Number.EPSILON即可认定为相等。Math.abs(a-b) < Number.EPSILON
  • 使用三方库进行计算:math.js、decimal.js
上次更新: 2025/09/05, 8:09:00
promise值穿透
js禁用F12开发者模式

← promise值穿透 js禁用F12开发者模式→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev