2011-12-05 33 views
38

Trong C# mã sau trả 2:Chuyển đổi một đôi đến một int trong Javascript mà không làm tròn

double d = 2.9; 
int i = (int)d; 
Debug.WriteLine(i); 

Trong javascript, tuy nhiên, cách duy nhất để chuyển đổi một "kép" cho một "int" mà tôi m nhận thức được là bằng cách sử dụng Math.round/sàn/toFixed vv Có cách nào để chuyển đổi sang một int trong Javascript mà không làm tròn? Tôi nhận thức được ý nghĩa hiệu suất của Number() vì vậy tôi muốn tránh chuyển đổi nó thành một chuỗi nếu có thể.

+4

Tại sao bạn loại trừ 'Math.floor'? – Quentin

+2

Các câu trả lời khuyên bạn sử dụng "parseInt()" tất cả có thể chuyển đổi thành một chuỗi nội bộ đầu tiên, bởi vì đó là những gì "parseInt()" mong đợi. Thực sự, hoặc là "Math.floor()" hoặc khác "~~ num" (hoạt động "không phải") sẽ cắt bớt giá trị chính xác kép của bạn thành một số nguyên. – Pointy

+0

Ông ta có thể loại trừ '' 'Math.floor''' bởi vì nó hoạt động khác với số âm. So sánh '' 'Math.floor (-2.5)' '' và '' '-2.5 | 0'''. – Fox32

Trả lời

88

Sử dụng parseInt().

var num = 2.9 
console.log(parseInt(num, 10)); // 2 

Bạn cũng có thể sử dụng |.

var num = 2.9 
console.log(num | 0); // 2 
+2

Có thể muốn thêm một cơ số (10) làm thông số thứ hai –

+0

@AdamRackis bạn đúng, cảm ơn bạn :) – kubetz

+0

parseInt (num, 10); - bạn đã thêm nó vào bảng điều khiển.cuộc gọi đăng nhập, không parseInt –

6

Chỉ cần sử dụng parseInt() và chắc chắn bao gồm các radix để bạn có được kết quả có thể dự đoán:

parseInt(d, 10); 
5

Không có điều nào như là int trong Javascript. Tất cả Numbers thực sự là gấp đôi đằng sau hậu trường * vì vậy bạn không thể dựa vào hệ thống loại để phát hành một thứ tự làm tròn cho bạn như bạn có thể trong C hoặc C#.

Bạn không cần phải lo lắng về các vấn đề chính xác (vì gấp đôi chính xác đại diện cho bất kỳ số nguyên nào lên đến 2^53) nhưng bạn thực sự bị mắc kẹt khi sử dụng Math.floor (hoặc các thủ thuật tương đương khác) nếu bạn muốn làm tròn số nguyên gần nhất.


* Hầu hết các công cụ JS sử dụng int gốc khi có thể nhưng tất cả trong tất cả các số JS vẫn phải có ngữ nghĩa kép.

+0

Tất cả các công cụ JS đều sử dụng int gốc khi chúng có thể (lưu ý rằng các phạm vi khác nhau: V8 đáng chú ý là các trường hợp đặc biệt là 31 bit). Ngay cả SpiderMonkey gần hai thập kỷ trước đã sử dụng ints bản địa khi họ có thể (khi nó được viết, nó đã được phổ biến cho máy tính để bàn không có hỗ trợ điểm nổi phần cứng, vì vậy nó là một tối ưu hóa hiệu suất rất cần thiết). – gsnedders

38

Tôi thấy các đề xuất "parseInt" khá tò mò, bởi vì "parseInt" hoạt động trên chuỗi theo thiết kế. Đó là lý do tại sao tên của nó có từ "phân tích" trong đó.

Một trick mà tránh được một cuộc gọi chức năng hoàn toàn là

var truncated = ~~number; 

Việc áp dụng đôi của "~" điều hành unary sẽ để lại cho bạn với một phiên bản cắt ngắn của một giá trị double-chính xác. Tuy nhiên, giá trị được giới hạn ở độ chính xác 32 bit, giống như tất cả các hoạt động JavaScript khác liên quan đến việc xem xét các số là số nguyên (như lập chỉ mục mảng và toán tử bitwise).

chỉnh sửa — Trong một bản cập nhật khá một thời gian sau, một thay thế cho các trick ~~ là Bitwise-OR giá trị với zero:

var truncated = number|0; 
+2

Đây là câu trả lời hay nhất, cảm ơn bạn đã đăng bài! – user1615362

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