11

私の以前の質問 ( JavaScript でランダムな整数を生成する最速の方法は何ですか? ) に対する受け入れられた回答では、シンボルを介して数値がどのように小数を失うのか疑問に思っていました|

例えば:

var x = 5.12042;
x = x|0;

その数をどのように床に置くの5ですか?

いくつかの例:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9
4

3 に答える 3

16

なぜなら、ECMAScript 仕様によると、ビット単位の演算子 operator はToInt32、評価される各式を呼び出すからです。

11.10 二項ビット演算子を参照してください。

上記のプロダクションのビット演算子の 1 つA : A @B@あるプロダクションは、次のように評価されます。

  1. 評価しAます。

  2. コールしGetValue(Result(1))ます。

  3. 評価しBます。

  4. コールしGetValue(Result(3))ます。

  5. 電話ToInt32(Result(2)).

  6. 電話ToInt32(Result(4)).

  7. とにビット演算子@を適用Result(5)Result(6)ます。結果は符号付き 32 ビット整数です。

  8. 戻るResult(7)

于 2012-01-28T23:56:53.347 に答える
5

ビット演算子は引数を整数に変換します ( http://es5.github.com/#x9.5を参照)。私が知っているほとんどの言語は、このタイプの変換をサポートしていません。

    $ python -c "1.0|0"
    トレースバック (最新の呼び出しが最後):
      ファイル ""、1 行目、
    TypeError: サポートされていないオペランド型 |: 'float' および 'int'

    $ ruby​​ -e '1.0|0'
    -e:1:in `': 未定義のメソッド `|' for 1.0:Float (NoMethodError)

    $ echo "int main(){1.0|0;}" | gcc -xc -
    : 関数 'main' 内:
    :1: エラー: バイナリへの無効なオペランド | ('double' と 'int' があります)

于 2012-01-28T23:54:53.283 に答える
2

を実行する場合floor、引数を整数に変換することは可能ですが、元の型が浮動小数点数であるため、これはほとんどの言語が行うことではありません。

データ型を維持しながらそれを行うより良い方法は、exponent数字をに移動しmantissa、残りのビットをゼロにすることです。

興味がある場合は、IEEE 仕様の浮動小数点数を参照してください。

于 2012-01-28T23:59:06.400 に答える