网站首页 > 文章精选 正文
由于计算机使用的双精度格式来存储浮点数,因此在计算和比较时经常会出现精度丢失而造成一些误判。今天来记录一下如何使用最小误差来比较两个浮点数大小。
es6新增了一个常量作为浮点数最小误差,Numer.EPSILON,这个常量值大小为Math.pow(2,-52),这是浮点数最小精度,小于这个精度,就会被认为无意义了。
因此我们可以利用这个最小误差来比较两个浮点数是否相等,如果小于这个精度就可以认为两个浮点数相等,大于这个精度就认为不想等
比较浮点数大小
/**
* 比较两个浮点数是否相等
*
* 由于浮点数在计算机中存储的精度问题,直接使用 `==` 或 `===` 进行比较可能会得到不准确的结果。
* 因此,我们使用 `Math.abs(a - b) < Number.EPSILON` 来比较两个浮点数是否相等。
*
* @param {number} a - 第一个浮点数
* @param {number} b - 第二个浮点数
* @returns {boolean} - 如果两个浮点数在一定精度范围内相等,则返回 `true`,否则返回 `false`
*/
function floatingComparison(a, b) {
// 使用 Math.abs 计算两个浮点数的差的绝对值,并与 Number.EPSILON 进行比较
// 如果差的绝对值小于 Number.EPSILON,则认为两个浮点数相等,返回 true
// 否则返回 false
return Math.abs(a - b) < Number.EPSILON;
}
双精度(64位)格式分为三部分
- 符号位:占1位,用于表示浮点数的正负。0表示正数,1表示负数。
- 指数位:占11位,用于表示浮点数的指数部分。指数的取值范围是-1022到1023。
- 尾数位:占52位,用于表示浮点数的尾数部分。尾数是一个二进制小数,它的小数点在最左边,即1.xxxxxx的形式。
JS里几个数字常量
- 最小精度|最小误差 Numer.EPSILON(2**-52)
- 最大数字 Numer.MAX_VALUE (约 2**1024-1)
- 最大安全数字 Numer.MAX_SAFE_INTEGER (2**53 - 1)
- 最小数字 Numer.MIN_VALUE(约 2**-1074)
- 最小安全数字 Numer.MIN_SAFE_INTEGER (-(2**53 - 1))
- 正无穷大数 Number.POSITIVE_INFINITY
- 负无穷数 Number.NEGATIVE_INFINITY
- 上一篇: 计算机是如何表示浮点数的
- 下一篇: 浮点数的算数法则
猜你喜欢
- 2025-01-09 C语言陷阱之浮点数精度问题
- 2025-01-09 字面量的特殊点
- 2025-01-09 单精度和双精度浮点数
- 2025-01-09 面试官问我存储金额应该用哪种数据类型,我竟这样回答
- 2025-01-09 「C初级」.浮点数的困惑
- 2025-01-09 西门子PLC数据类型——浮点数
- 2025-01-09 浮点型数据
- 2025-01-09 2022系统分析师考试准备(九)——计算机系统(2014)
- 2025-01-09 为什么float和double运算会丢失精度?BigDecimal就一定靠谱?
- 2025-01-09 浮点数的算数法则
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)