2012-01-28 24 views
9

Trong câu trả lời được chấp nhận trong câu hỏi trước đây của tôi (What is the fastest way to generate a random integer in javascript?), tôi đã tự hỏi làm thế nào một số mất số thập phân của nó thông qua biểu tượng | .Làm thế nào để x | 0 sàn số trong JavaScript?

Ví dụ:

var x = 5.12042; 
x = x|0; 

Làm thế nào để sàn rằng số để 5?

Một số chi tiết ví dụ:

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

Bạn nên lưu ý rằng việc sử dụng các toán tử bitwise sẽ giới hạn bạn thành các số nguyên đã ký 32 bit. '((Math.pow (2,32)/2) -1) | 0; // 2147483647' Xóa '-1' và bạn sẽ không nhận được kết quả mong muốn. '((Math.pow (2,32)/2)) | 0; // -2147483648' –

+0

Thú vị. Đó có thể là lý do mà hàm này nhanh hơn một chút so với hàm 'Math.floor (x)'. http://jsperf.com/floor-or-or – user824294

+1

nó không thực sự là 'sàn', hãy thử với '-1.23' để xem điều gì xảy ra – ajax333221

Trả lời

13

Bởi vì, theo các thông số kỹ thuật ECMAScript, nhà khai thác Bitwise khai thác gọi ToInt32 trên mỗi biểu thức được đánh giá.

Xem 11.10 Binary Bitwise Operators:

Việc sản xuất A : A @B, nơi @ là một trong những nhà khai thác Bitwise trong các tác phẩm trên, được đánh giá như sau:

  1. Đánh giá A.

  2. Gọi GetValue(Result(1)).

  3. Đánh giá B.

  4. Gọi GetValue(Result(3)).

  5. Gọi ToInt32(Result(2)).

  6. Gọi ToInt32(Result(4)).

  7. Áp dụng các toán tử Bitwise @ để Result(5)Result(6). Kết quả là một số nguyên 32 bit có dấu.

  8. Trả lại Result(7).

5

nhà khai thác Bitwise chuyển đổi lập luận của họ để số nguyên (xem http://es5.github.com/#x9.5). Hầu hết các ngôn ngữ Tôi biết không hỗ trợ kiểu này chuyển đổi:

 
    $ python -c "1.0|0" 
    Traceback (most recent call last): 
     File "", line 1, in 
    TypeError: unsupported operand type(s) for |: 'float' and 'int' 

    $ ruby -e '1.0|0' 
    -e:1:in `': undefined method `|' for 1.0:Float (NoMethodError) 

    $ echo "int main(){1.0|0;}" | gcc -xc - 
    : In function ‘main’: 
    :1: error: invalid operands to binary | (have ‘double’ and ‘int’) 

+4

' s/Hầu hết (. *?) không/gõ mạnh \ 1 thường không/'(Tuy nhiên, điều này phụ thuộc rất nhiều vào ngôn ngữ.) –

2

Khi làm một floor, mặc dù nó sẽ có thể để chuyển đổi các tham số cho một số nguyên, đây không phải là điều mà hầu hết ngôn ngữ sẽ làm gì vì loại ban đầu là một số dấu chấm động.

Cách tốt hơn để thực hiện việc này trong khi vẫn giữ kiểu dữ liệu là chuyển đến số exponent vào số mantissa và không còn các bit còn lại.

Nếu bạn quan tâm, bạn có thể xem số IEEE spec để biết số dấu phẩy động.

Các vấn đề liên quan