簡體   English   中英

區分 +0 和 -0

[英]Differentiating +0 and -0

盡管+0-0不同的實體,但+0 === -0計算結果為true 那么,你如何區分+0-0呢?

有一個黑客:

if (1 / myZero > 0) {
   // myZero is +0
} else {
   // myZero is -0
}

我能做得更好嗎?

在 ECMAScript 6 中, Object.is行為類似於===只是它區分正零和負零,並且Object.is(NaN, NaN)計算結果為true (請參閱此處的文章。)

Chrome 24 支持Object.is

這仍然是某種黑客行為,但查看規范表明了這一點:

Math.atan2(0, -0) === Math.PI // true
Math.atan2(0,  0) === 0       // true

根據大衛弗拉納根的書,p。 34 ,將 1 除以零將產生相應的無窮大,然后可以在等式檢查中使用它:

1 / 0
> Infinity
1 / -0
> -Infinity

這是無窮大的相等比較的行為:

Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true

這將返回 +0:

-0 + 0

這無助於區分 -0 和 +0,但這有助於確保某些值不是 -0。

1 / -0       => -Infinity  
1 / (-0 + 0) => Infinity

正如人們似乎難以理解這樣做的實際需求是什么:這是我的用例......

我需要一個解決方案來按索引對表的列進行排序。 單擊<th>並使用 [ordinal] 升序和 -[ordinal] 降序調用排序器。 第一列將給出-0表示降序或0表示升序。

所以我需要區分+0-0並在這里結束。 對我有用的解決方案在@Šime Vidas 的評論中,但有些隱藏。

[已刪除部分 - 請參閱下面的評論]

要檢查負零,這里有一個簡單的解決方案。

function isNegativeZero(n) {
    n = Number( n );
    return (n === 0) && (1 / n === -Infinity);
}

Node.js 中的一個直接選擇是使用Buffer

var negZero = Buffer('8000000000000000', 'hex')

var buf = Buffer(8);
buf.writeDoubleBE(myZero);

if (buf.equals(negZero)) {
    // myZero is -0
} else {
    // myZero is +0
}

此外,您可以通過緩沖模塊輕松瀏覽它們。

正如馬特芬威克所暗示的那樣,你可以這樣做(使用 var zero ):

if(1/zero===Infinity) {
  // zero is +0
} else {
  // zero is -0
}

使用Math.sign()

Math.sign( 1 / +0 )
Math.sign( 1 / -0 )

Math.sign( 1 / x )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM