2012-04-14 43 views
51

Đối với tập lệnh tôi đang viết, tôi cần hiển thị số đã được làm tròn, nhưng không hiển thị số thập phân hoặc bất kỳ thứ gì trong quá khứ. Tôi đã nhận được để làm tròn nó đến vị trí thứ ba, nhưng tôi không chắc chắn làm thế nào để đi về chỉ cần thả thập phân và tất cả mọi thứ qua nó, vì nó không có vẻ như JavaScript có một chức năng substr như PHP nào.Cắt ngắn/làm tròn toàn bộ số trong JavaScript?

Bất kỳ đề xuất nào?

+2

làm tròn và cắt bỏ 2 hoạt động khác nhau. Bạn đang cố gắng làm cái nào? –

+0

'.substring()' hoàn toàn là một hàm trong javascript. –

+2

** PHƯƠNG PHÁP ĐƯỢC GỌI '.toFixed()' ** – neaumusic

Trả lời

96

Nếu bạn có một chuỗi, phân tích nó như một số nguyên:

var num = '20.536'; 
var result = parseInt(num, 10); // 20 

Nếu không, ECMAScript 6 Mời Math.trunc cho cắt ngắn hoàn toàn phù hợp, đã có sẵn trong Firefox 24+ và Edge:

var num = -2147483649.536; 
var result = Math.trunc(num); // -2147483649 

Nếu bạn không thể dựa vào đó và sẽ luôn có số dương, bạn có thể chỉ cần sử dụng Math.floor:

var num = 20.536; 
var result = Math.floor(num); // 20 

Và cuối cùng, nếu bạn có một số trong [− 2147483648, 2147483647], bạn có thể cắt ngắn thành 32 bit bằng cách sử dụng bất kỳ toán tử bitwise nào. | 0 là phổ biến, và >>> 0 thể được sử dụng để có được một 32-bit unsigned integer:

var num = -20.536; 
var result = num | 0; // -20 
+6

Math.floor() sẽ cho kết quả sai cho các số âm. Hãy xem xét câu trả lời của mozey bên dưới để có các giải pháp thay thế tốt hơn. –

+0

@JonBrooks: Cảm ơn, nhưng tôi đã đề xuất 'parseInt' để bắt đầu. Xem xét câu trả lời của mozey cho các giải pháp thay thế phức tạp, chậm. – Ryan

+2

'trunc2' của mozey thực sự là tùy chọn đúng, cộng với nó sử dụng so sánh số nguyên hơn là phân tích cú pháp chuỗi sẽ làm cho nó nhanh hơn 'parseInt', cùng với luôn trả về kết quả chính xác. – BlinkyTop

2

Sử dụng Math.floor():

var f = 20.536; 
var i = Math.floor(f); // 20 

http://jsfiddle.net/J4UVV/1/

+1

Nếu bạn sử dụng một số âm nói -20.536 thì bạn sẽ nhận được kết quả sai cho cắt ngắn vì nó dẫn đến -21 http://jsfiddle.net/zL1v5e2k/ –

8

Chuyển đổi số thành một chuỗi và vứt bỏ tất cả mọi thứ sau thập phân.

trunc = function(n) { return Number(String(n).replace(/\..*/, "")) } 

trunc(-1.5) === -1 

trunc(1.5) === 1 

Sửa 2013-07-10

Như đã chỉ ra bởi minitech và thứ hai nghĩ rằng phương pháp chuỗi dường như một chút quá mức. Vì vậy, so sánh các phương pháp khác nhau được liệt kê ở đây và các nơi khác:

function trunc1(n){ return parseInt(n, 10); } 
function trunc2(n){ return n - n % 1; } 
function trunc3(n) { return Math[n > 0 ? "floor" : "ceil"](n); } 
function trunc4(n) { return Number(String(n).replace(/\..*/, "")); } 

function getRandomNumber() { return Math.random() * 10; } 

function test(func, desc) { 
    var t1, t2; 
    var ave = 0; 
    for (var k = 0; k < 10; k++) { 
     t1 = new Date().getTime(); 
     for (var i = 0; i < 1000000; i++) { 
      window[func](getRandomNumber()); 
     } 
     t2 = new Date().getTime(); 
     ave += t2 - t1; 
    } 
    console.info(desc + " => " + (ave/10)); 
} 

test("trunc1", "parseInt"); 
test("trunc2", "mod"); 
test("trunc3", "Math"); 
test("trunc4", "String"); 

Kết quả, trong đó có thể thay đổi dựa trên phần cứng, như sau:

parseInt => 258.7 
mod  => 246.2 
Math  => 243.8 
String => 1373.1 

Các Math.floor phương pháp/ceil là nhẹ nhanh hơn parseInt và mod. Chuỗi thực hiện kém so với các phương thức khác.

+0

'parseInt' và chuỗi thay thế sẽ trả về các câu trả lời sai cho số lớn hơn 999999999999999900000. – Ryan

+0

của tôi lấy đi từ kinh nghiệm này: trừ khi hiệu suất là một vấn đề lớn, chỉ cần sử dụng 'parseInt' cho đơn giản, nếu không thực hiện' trunc3() ' – RozzA

12

Tôi sẽ thêm giải pháp của mình tại đây. Chúng ta có thể sử dụng sàn khi giá trị là trên 0 và ceil khi họ đang có nhỏ hơn không:

function truncateToInt(x) 
{ 
    if(x > 0) 
    { 
     return Math.floor(x); 
    } 
    else 
    { 
     return Math.ceil(x); 
    } 
} 

Sau đó:

y = truncateToInt(2.9999); // results in 2 
y = truncateToInt(-3.118); //results in -3 
+2

Tôi không hiểu tại sao câu trả lời này đã được downvoted. Đó là cách chính xác duy nhất! – BlinkyTop

15
câu trả lời

Travis Pessetto cùng với chức năng mozey của trunc2 là những câu trả lời đúng duy nhất, xem xét như thế nào JavaScript thể hiện các số dấu chấm động rất nhỏ hoặc rất lớn trong ký pháp khoa học.

Ví dụ: parseInt(-2.2043642353916286e-15) sẽ không phân tích cú pháp đầu vào đó một cách chính xác.Thay vì trả lại 0, nó sẽ trả lại -2.

Đây là (và IMHO điên nhất) cách chính xác để làm điều đó:

function truncate(number) 
{ 
    return number > 0 
     ? Math.floor(number) 
     : Math.ceil(number); 
} 
+0

Đối với tôi, Math.trunc (-2.2043642353916286e-15) trả về 0. Tôi đã thử nghiệm nó trong https://www.typescriptlang.org/play/ – Devid

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