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

浮点数精度问题

目录

  • ieee754标准
  • 解决方法

和c语言一样,所有以ieee754标准的语言都有浮点数精度问题,js也有浮点数精度问题,并且因为是弱类型语言这个问题更严重,js的Number类型的数据都被视为浮点数

ieee754标准

在这里插入图片描述
js的数字类型就相当于c语言double类型,是64位的

  • 符号位也是首位
  • 指数位一共11位,表示指数
  • 尾数位一共52位,表示小数点后的数,超出部分舍1进0
    在这里插入图片描述
    所以我们的小数表示只能是2**-1、2**-2、2**-3以此类推
    也就是0.5,0.25,0.125
    所以像0.1、0.7这些数据就无法精准表示,计算就会出错
console.log(0.1 + 0.2);  // 0.30000000000000004
console.log(0.1 + 0.7);  // 0.7999999999999999

为了验证该例子,我们得先知道怎么将浮点数转换为二进制,整数我们可以用除 2 取余的方式,小数我们则可以用乘 2 取整的方式。
将0.1转为二进制
0.1 * 2,值为 0.2,小数部分 0.2,整数部分 0

0.2 * 2,值为 0.4,小数部分 0.4,整数部分 0

0.4 * 2,值为0.8,小数部分0.8,整数部分0

0.8 * 2,值为 1.6,小数部分 0.6,整数部分 1

0.6 * 2,值为 1.2,小数部分 0.2,整数部分 1

0.2 * 2,值为 0.4,小数部分 0.4,整数部分 0

0.2 开始循环,也就是0.00110011001100110…
而0.2的二进制为 0.00110011001100110011…
0.1 + 0.2 = 0.011011…
转为十进制
0.(02)-1+(12)-2+(1**2)-3…
最终在第52位截取(0舍1入)
所以 0.30000000000000004是这么来的

解决方法

通常这种对精度要求高的计算都应该交给后端去计算和存储,因为后端有成熟的库来解决这种计算问题。

前端也有几个不错的类库:

Math.js

Math.js 是专门为 JavaScriptNode.js 提供的一个广泛的数学库。它具有灵活的表达式解析器,支持符号计算,配有大量内置函数和常量,并提供集成解决方案来处理不同的数据类型。

像数字,大数字(超出安全数的数字),复数,分数,单位和矩阵。 功能强大,易于使用。

decimal.js

JavaScript 提供十进制类型的任意精度数值。

big.js

不仅能够支持处理 Long 类型的数据,也能够准确的处理小数的运算。

相关文章:

  • vue项目中,添加主题皮肤切换功能
  • 负指数二项式展开
  • 【Unity】animator检测某state动画播放完毕方法
  • C高级,终端操作
  • 如何保证RabbitMQ消息的可靠传输?
  • 【Scratch编程系列】程序积木-外观类
  • 1101复位之后故障仍保持原因分析
  • 交换机和集线器的区别
  • Compose笔记(十四)--LazyColumn
  • 计算机系统---性能指标(1)CPU与GPU
  • 横扫SQL面试——PV、UV问题
  • 语法: i8=make8( var, offset);
  • 3D Gaussian Splatting as MCMC 与gsplat中的应用实现
  • Python面向对象-开闭原则(OCP)
  • Access:在移动互联网与AI时代焕发新生
  • ReFormX:现代化的 React 表单解决方案 - 深度解析与最佳实践
  • sojson。v5:新一代JavaScript代码保护工具的技术解析与应用场景
  • 代码随想录回溯算法03
  • Spring 中的 IOC
  • Unet网络的Pytorch实现和matlab实现
  • 域名 网站 区别/免费的模板网站
  • 做平面的网站/网站分析报告
  • 求手机网站/全网营销策划公司
  • 专门做服装批发的网站吗/百度最新版app下载安装
  • 内江规划建设教育网站/交换友情链接
  • 长沙有哪些网站建设公司好/谷歌广告代运营