Làm cách nào tôi có thể xóa phần thập phân khỏi số JavaScript?


218

Tôi có kết quả của một phép chia và tôi muốn loại bỏ phần thập phân của số kết quả.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


384

Bạn đã có thể sử dụng...

... phụ thuộc vào cách bạn muốn xóa số thập phân.

Math.trunc()chưa được hỗ trợ trên tất cả các nền tảng (cụ thể là IE), nhưng bạn có thể dễ dàng sử dụng một polyfill trong thời gian này.

Một phương pháp cắt ngắn phần phân đoạn với sự hỗ trợ nền tảng tuyệt vời là sử dụng toán tử bitwise (.eg |0). Tác dụng phụ của việc sử dụng toán tử bitwise trên một số là nó sẽ coi toán hạng của nó là số nguyên 32 bit đã ký, do đó loại bỏ thành phần phân số. Hãy nhớ rằng điều này cũng sẽ mang số lượng lớn hơn 32 bit.


Bạn cũng có thể nói về sự không chính xác của làm tròn số thập phân với số học dấu phẩy động.

Yêu cầu đọc - Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động .


29
Hãy nhớ rằng Math.floor()sẽ tăng giá trị số khi số âm . Do đó, Math.floor(-1.2) -> -2trong khi Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( như được đề cập bởi @FloydPink ) sẽ loại bỏ phần thập phân như mong đợi cho cả số dương và số âm .
Paul T. Rawkeen

1
@ PaulT.Rawkeen Bạn cũng có thể sử dụng toán tử bitwise để bỏ phần thập phân, nhưng hãy nhớ rằng nó cũng cắt ngắn thành 32 bit.
alex

2
Sau đây cho thấy câu trả lời này không ổn định:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake Kết quả của 2.3*100javascript là 229.99999999999997, vì vậy có vẻ như toán tử bitwise đang thực hiện đúng công việc của nó trong ví dụ của bạn.
Chad von Nau

Có một giải pháp tương tự như |0sử dụng số nguyên 64 bit không?
Clint

49

Bạn cũng có thể sử dụng các toán tử bitwise để cắt bớt số thập phân.

ví dụ

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Các phép toán bitwise hiệu quả hơn đáng kể so với các hàm Math. Các đôi điều hành không Bitwise cũng có vẻ hơi tốt hơn các x | 0x << 0Bitwise hoạt động bởi một lượng không đáng kể.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Cũng đáng chú ý là toán tử bitwise không được ưu tiên hơn các phép toán số học, do đó bạn có thể cần phải bao quanh các phép tính với dấu ngoặc đơn để có kết quả như mong muốn:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Thông tin thêm về toán tử đôi bitwise không có thể được tìm thấy tại Double bitwise KHÔNG (~ ~)


2
Có thể có hiệu quả cận biên. Nhưng, tôi sẽ đề xuất các hàm 'Math', vì nó dễ đọc hơn.
ashipj

Rất có thể điều này không hoạt động nếu số nguyên không được biểu thị dưới dạng số nguyên có chữ ký 32 bit ( stackoverflow.com/a/7488075/3655192 )
Hiroki

30

Bạn cũng có thể làm

parseInt(a/b)

17
Lưu ý rằng parseIntsẽ không hoạt động đáng tin cậy cho số lượng lớn, bởi vì nó hoạt động bằng cách trước tiên chuyển đổi đối số của nó thành một chuỗi và đối với số lượng lớn, kết quả sẽ sử dụng ký hiệu số mũ. Ví dụ: var n = 22222222222222222222222; parseInt(n);sẽ trả về 2, vì n.toString()trả về 2.2222222222222223e+22.

2
Nó cũng không sử dụng parseInt()cho mục đích của nó, đó là lấy một số trong một chuỗi và trả về a Number.
alex

22

u cũng có thể hiển thị một số chữ số nhất định sau dấu thập phân (ở đây là 2 chữ số) bằng cách sử dụng mã sau:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
Xin lưu ý rằng toFixed () trả về một Chuỗi chứ không phải Số. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Khăn

1
Đây là câu trả lời như thế nào khi OP yêu cầu xóa phần thập phân
Isaac

3
Mặc dù nó trả về một chuỗi, bạn chỉ có thể sử dụng phương thức Number () để sửa lỗi đó .. Number ((15.46974) .toFixed (2))
iPzard

13

Sử dụng Math.round()chức năng.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
Để đầy đủ, đây là JavaScript đơn giản, không phải truy vấn.
Dave Newton

1
$.round = Math.round;)
alex


6

Với ES2015, Math.trunc () khả dụng.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Nó không được hỗ trợ trong IE11 trở xuống, nhưng hoạt động trong Edge và mọi trình duyệt hiện đại khác.


2
Biết bất kỳ biến thể nào cho phép cắt ngắn đến X vị trí thập phân? Nó sẽ là ngây thơ khi nghĩ rằng Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)sẽ làm việc?
jamiebarrow

2
Này Jamie, có vẻ như điều đó sẽ hoạt động trong hầu hết các trường hợp, nhưng nó dễ bị mắc phải các vấn đề nổi. ví dụ value = 2.3x = 2sẽ trở lại 2.29. Tôi không có một đề nghị tốt hơn.
Chad von Nau

Điều này với tôi nghe như câu trả lời đúng. Không làm tròn trên hoặc dưới. Không có vấn đề với số âm. Chỉ cần loại bỏ số thập phân. Như câu hỏi yêu cầu.
Lều Enrique Moreno

2

Nếu bạn không quan tâm đến việc chia sẻ, chỉ cần chuyển đổi số thành chuỗi, sau đó xóa mọi thứ sau khoảng thời gian bao gồm cả khoảng thời gian. Điều này hoạt động cho dù có một số thập phân hay không.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed sẽ hoạt động như vòng.

Đối với sàn như hành vi sử dụng%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
Tại sao bạn cảm thấy điều này tốt hơn là sử dụng Math.floor? Giải pháp của bạn có vẻ phức tạp không cần thiết và chậm. Tôi không biết Math.floor hoạt động như thế nào, nhưng tôi hy vọng nó sẽ được tối ưu hóa hơn rất nhiều. Ngoài ra, tôi tự hỏi nếu giải pháp của bạn có thể bị lỗi làm tròn điểm nổi.
Hans Roerdinkholder 10/2/2016

1

Dưới đây là phần nén trong phần giải thích chi tiết với sự trợ giúp của các bài viết trên:

1. Math.trunc (): Nó được sử dụng để loại bỏ các chữ số được theo sau bởi dấu chấm. Nó chuyển đổi ngầm. Nhưng, không được hỗ trợ trong IE.

Thí dụ:

Toán.trunc (10.5) // 10

Toán.trunc (-10,5) // -10

Cách khác: Sử dụng toán tử bitwise not:

Thí dụ:

x = 5,5

~ ~ x // 5

2. Math.floor (): Nó được sử dụng để đưa ra giá trị nguyên tối thiểu có thể nhìn thấy được. Nó được hỗ trợ trong tất cả các trình duyệt.

Thí dụ:

Math.floor (10.5) // 10

Toán.floor (-10,5) // -11

3. Math.ceil (): Nó được sử dụng để đưa ra giá trị nguyên cao nhất có thể. Nó được hỗ trợ trong tất cả các trình duyệt.

Thí dụ:

Math.ceil (10.5) // 11

Toán.ceil (-10,5) // -10

4. Math.round (): Nó được làm tròn đến số nguyên gần nhất. Nó được hỗ trợ trong tất cả các trình duyệt.

Thí dụ:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10,49) // 10

Math.round (-10.51) // -11


0

Để triển khai ES6, hãy sử dụng một cái gì đó như sau:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

Điều này dành cho những người muốn ngăn người dùng nhập số thập phân

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

Bạn có thể sử dụng .toFixed (0) để xóa phần thập phân hoàn chỉnh hoặc cung cấp số trong các đối số mà bạn muốn số thập phân được cắt bớt.

Lưu ý: toFixed sẽ chuyển đổi số thành chuỗi.


0

Ví dụ:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

hoặc là

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.