javascript - 为什么在 JavaScript 中任何数字除以 -Infinity 时都会得到 -0?

标签 javascript jestjs ieee-754 negative-number

我在 Jest 中编写一些 JavaScript 测试只是为了练习。我编写了以下函数:

const divide = (a, b) => {
  if (isNaN(a) || isNaN(b)) {
    throw new Error("This function expect 2 numbers");
  } 
  return a / b;
};

然后我编写了以下测试:

describe("Test divide operator", () => {
  it("Check the divide function", () => {
    expect(divide(10, 0)).toBe(Infinity);
    expect(divide(0, 0)).toBe(NaN);
    expect(divide(Infinity, Infinity)).toBe(NaN);
    expect(divide(10, Infinity)).toBe(0);
    expect(divide(10, -Infinity)).toBe(0);  // THIS TEST FAILS
  });
});

我收到以下错误:

    expect(received).toBe(expected) // Object.is equality

    Expected: 0
    Received: -0

这是一个 JavaScript 错误吗?有人知道为什么 JavaScript 中 0 可以是负数吗? 在我看来,为了通过测试而必须写“-0”有点尴尬。

谢谢。

最佳答案

这不是一个错误,而是 IEEE-754 关于浮点运算的“功能”。 -0 是一个有符号的 0,javascript 正确地实现了它。

实际遇到的情况极其罕见,而且也存在争议。其他语言的处理方式有所不同。

还有-0 === 0 AND -0 === +0,所以通常并不重要。

关于javascript - 为什么在 JavaScript 中任何数字除以 -Infinity 时都会得到 -0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73226382/

相关文章:

javascript - 错误: concatUint8Array: Data must be in the form of a Uint8Array

floating-point - IEEE 浮点标准中指数和尾数大小的基本原理是什么?

javascript - 不使用 Wea​​kMap.set 方法更改 JavaScript WeakMap 键/值对的值是否有任何缺点?

javascript - 动态模块加载在 Firefox 上不起作用 - SyntaxError : dynamic module import is not implemented

javascript - 测试值是否传递给发出事件的方法,Vue

javascript - Jest : how to mock console when it is used by a third-party-library?

double - 下一个更高/更低的 IEEE double

c - __STDC_IEC_559__ 与现代 C 编译器的状态

javascript - 添加/删除值以在单击时输入

javascript - 如果元素包含该名称,则使用 'for' 循环从元素中删除类名称,否则什么也不做