JavaScript 中存在 +0 和 -0 两个不同值,源于 IEEE 754 标准对浮点数符号位的定义;可用 1/x 除法、Object.is() 或 Math.sign() 配合 Object.is 判别,多见于浮点计算误差、字符串转换等场景,通常无需区分,仅科学计算等符号敏感领域需特别处理。

JavaScript 中的 +0 和 -0 在大多数场景下表现一致,但它们确实是两个不同的值,且可通过特定方式区分。
为什么会有 +0 和 -0?
这是 IEEE 754 浮点数标准的规定:浮点数由符号位、指数位和尾数位组成,0 也有符号位。因此存在“符号为正的零”(+0)和“符号为负的零”(-0)。它们在数值比较、算术运算中通常相等,但某些操作会暴露差异。
如何准确判断一个值是 +0 还是 -0?
不能用 === 或 ==(因为 +0 === -0 返回 true),也不能依赖 Math.sign() 对 0 的处理(它对 -0 返回 -0,但显示为 -0,需进一步判断)。
推荐以下几种可靠方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
-
除法判别法(最常用):用
1 / x。若结果为Infinity,则x是+0;若为-Infinity,则是-0。 -
Object.is() 判别法:ES6 引入的
Object.is(+0, -0)返回false,而Object.is(x, -0)可直接判断x是否严格等于-0。 -
Math.sign() 辅助法:注意
Math.sign(-0)返回-0(不是-1),而Math.sign(+0)返回0。可结合Object.is(Math.sign(x), -0)精确识别。
实际中哪些地方会遇到 -0?
多数情况由计算过程隐式产生,例如:
-
0 * -1、-0.1 + 0.1(浮点误差可能产生 -0) -
parseInt("-0")或Number("-0")得到-0 - 从后端或 JSON 解析中传入字符串
"-0"并转为数字 - 某些数学函数边界行为,如
Math.atan2(-0, -1)返回-π,而Math.atan2(+0, -1)返回π
是否需要特别处理?
绝大多数业务逻辑无需区分 +0 和 -0,比如数组索引、对象键、条件判断(if (x) {...} 中两者都为 false)、JSON 序列化(都转为 0)等均无差别。
仅在以下场景才需关注:
- 科学计算、图形渲染、物理模拟等对符号敏感的领域
- 实现高精度数值库或 polyfill(如自定义
Math.sign) - 调试浮点运算异常或验证输入数据的符号完整性

















