检查 JavaScript 对每个表达式执行的步骤可能会有所帮助。
在.99999999999999999===1
:
- 源文本
.99999999999999999
被转换为数字。最接近的数字是 1,这就是结果。(下一个最接近的数字是 0.99999999999999988897769753748434595763683319091796875,即1–2–53。)
- 然后将 1 与 1 进行比较。结果为真。
在(1-Number.MIN_VALUE) === 1
:
Number.MIN_VALUE
为 2 –1074,约 5e–304。
- 1–2 –1074非常接近 1。确切的值不能表示为数字,因此使用最接近的值。同样,最接近的值为 1。
- 然后将 1 与 1 进行比较。结果为真。
在Math.ceil(Number.MIN_VALUE)
:
Number.MIN_VALUE
为 2 –1074,约 5e–304。
- 该值的上限函数为 1。
在Math.floor(.999999999999)
:
- 源文本
.999999999999
被转换为数字。最接近的数字是 0.99999999999900002212172012150404043495655059814453125,这就是结果。
- 该值的底函数为 0。
在Math.floor(.99999999999999999)
:
- 源文本
.99999999999999999
被转换为数字。最接近的数字是 1,这就是结果。
- 1 的底函数为 1。
这里最多只有两件事令人惊讶。一是将源文本中的数字转换为内部数字值。但这应该不足为奇。当然,文本必须转换为数字的内部表示,而 Number 类型不能完美地存储所有无限多的数字。所以它必须圆。当然,数字非常接近 1 比 1。
另一个可能令人惊讶的事情是1-Number.MIN_VALUE
1。但这实际上是同一个问题:确切的结果不可表示,但它非常接近 1,因此使用 1。
该Math.floor
功能正常工作。它从不引入任何错误,并且您不必做任何事情来保证它会向下舍入。它总是这样。
但是,由于您想对数字进行规范化,因此您似乎可能会在某个时候对数字进行除法。除法时,可能会出现舍入问题,因为很多除法的结果不能完全表示,所以必须进行舍入。
但是,这是一个单独的问题,您在此问题中没有提供足够的信息来解决您计划进行的具体计算。您应该为此打开一个单独的问题。