Làm cách nào để kiểm tra giá trị là số nguyên trong JavaScript?

Tạo số nguyên ngẫu nhiên trong lập trình là một nhiệm vụ tương đối phổ biến. Khi bạn đã biết cách thực hiện thì sẽ rất nhanh chóng và dễ dàng… chỉ cần một dòng mã. Trong hướng dẫn nhanh này, chúng tôi sẽ chỉ cho bạn cách. Chúng tôi sẽ xây dựng mã để đảm bảo bạn hiểu ý nghĩa của từng phần

Để trợ giúp về ngữ cảnh, giả sử chúng ta muốn tạo một số nguyên ngẫu nhiên lớn hơn hoặc bằng 1 và nhỏ hơn hoặc bằng 20. Chúng tôi muốn lưu trữ số dưới dạng một biến được gọi là số

Bước 1. tạo một số ngẫu nhiên

JavaScript có một phương pháp đơn giản để tạo một số ngẫu nhiên. "Tuyệt vời. Điều này sẽ được dễ dàng sau đó. " bạn có thể nghĩ. Mặc dù bạn hơi đúng (rốt cuộc đó chỉ là một dòng duy nhất mà chúng tôi đang xây dựng), nhưng nó cũng không đơn giản như vậy. Số ngẫu nhiên được trả về sẽ lớn hơn hoặc bằng 0 và nhỏ hơn 1. Không tuyệt vời khi chúng tôi đang cố gắng tạo một số nguyên từ 1 đến 20. Đó là nơi chúng ta phải bắt đầu mặc dù

const number = Math.random();

“Toán học” là một Đối tượng do JavaScript cung cấp cho chúng ta. Nó có một số Phương thức tích hợp sẵn mà chúng ta có thể sử dụng. Một trong những phương pháp là ngẫu nhiên(). Vì một phương thức về cơ bản là một loại hàm, theo sau nó là dấu ngoặc đơn

Những gì dòng trên đang nói là,

“Tạo cho tôi một biến có tên là số và biến giá trị của nó thành một số ngẫu nhiên trong khoảng từ 0 (bao gồm) đến 1 (không bao gồm). ”

Bước 2. nhân với 20

Điều đầu tiên chúng ta cần làm là tăng kích thước của số ngẫu nhiên. Để làm như vậy, chúng tôi nhân nó với số cao nhất mà chúng tôi muốn đạt được. Trong ví dụ của chúng tôi, chúng tôi muốn số lượng tối đa của chúng tôi là 20 vì vậy đó là những gì chúng tôi sẽ nhân với. Điều đó có nghĩa là lần lặp tiếp theo của dòng mã của chúng tôi là

const number = Math.random()*20;

Những gì dòng trên đang nói là,

“Hãy tạo cho tôi một biến có tên là số. Tính toán giá trị của nó cho tôi bằng cách lấy một số ngẫu nhiên trong khoảng từ 0 (bao gồm) đến 1 (không bao gồm) và nhân số đó với 20. ”

Khi chúng tôi làm điều đó, chúng tôi đang tạo một số ngẫu nhiên trong khoảng từ 0 (bao gồm) đến 20 (độc quyền). Số ngẫu nhiên đó có thể sẽ có một số lượng lớn các chữ số thập phân sau nó. Trong khi chúng ta tiến gần hơn đến mục tiêu cuối cùng của mình, chúng ta vẫn còn một chút việc phải làm

Bước 3. loại bỏ các chữ số thập phân

Số (số) ngẫu nhiên của chúng tôi hiện có thể được xác định như sau

0 <= số < 20 với bất kỳ số chữ số thập phân nào

Tuy nhiên điều đó là chưa đủ vì mục tiêu cuối cùng của chúng tôi là

1 <= số <= 20 không có chữ số thập phân

Xóa các chữ số thập phân không quá phức tạp vì một lần nữa, JavaScript đã hỗ trợ chúng tôi bằng các công cụ tích hợp của nó

const number = Math.trunc(Math.random()*20);

Cũng như các phương trình trong toán học, JavaScript sẽ tính giá trị của số bằng cách thực hiện phép tính trong ngoặc trước rồi mới thực hiện phần tiếp theo

Vậy Toán. random()*20 sẽ được tính trước. Toán học. trunc() sau đó sẽ được thực hiện trên số kết quả. Như với Bước 1, Math là đối tượng và trong trường hợp này, trunc() là phương thức.  

Những gì dòng trên đang nói là,

“Hãy tạo cho tôi một biến có tên là số. Tính toán giá trị của nó cho tôi bằng cách tạo một số ngẫu nhiên trong khoảng từ 0 (bao gồm) đến 20 (không bao gồm) rồi cắt ngắn nó để xóa các dấu thập phân. ”

Dòng này sẽ tạo ra một số nguyên (một số nguyên) trong khoảng từ 0 (đã bao gồm) đến 19 (đã bao gồm). gần đó

Bước 4. tăng phạm vi lên 1

Đây có lẽ là bước dễ nhất trong quá trình xây dựng dòng mã của chúng tôi. Thậm chí có thể một số mà một số bạn có thể đã có thể tự mình tìm ra. Đừng lo lắng nếu bạn chưa từng… đã có rất nhiều điều cần tiếp thu và có thể là những điều mới để bạn xem và học hỏi. Thực tế là bạn đã vượt qua giai đoạn này của hướng dẫn có nghĩa là bạn đang làm tất cả những điều phù hợp để trở thành Nhà phát triển JavaScript tuyệt vời

Bước trước đã cho chúng tôi một số nguyên từ 0 đến 19. Chúng tôi cần đó là 1 và 20, vì vậy chúng tôi chỉ cần thêm 1 như bên dưới

const number = Math.trunc(Math.random()*20) + 1;

Những gì dòng trên đang nói là,

“Hãy tạo cho tôi một biến có tên là số. Tính toán giá trị của nó cho tôi bằng cách tạo một số nguyên ngẫu nhiên trong khoảng từ 0 (đã bao gồm) đến 19 (đã bao gồm) rồi thêm 1 vào số ngẫu nhiên đó. ”

Số ngẫu nhiên thấp nhất được tạo trước khi thêm 1 sẽ là 0, có nghĩa là số thấp nhất của chúng tôi sẽ là 1. Số ngẫu nhiên cao nhất trước khi thêm 1 là 19, có nghĩa là số cao nhất của chúng tôi sẽ là 20. Chúng tôi sẽ không có bất kỳ chữ số thập phân nào vì vậy chúng tôi đã hoàn tất

Các số thông thường trong JavaScript được lưu trữ ở định dạng 64 bit IEEE-754, còn được gọi là "số dấu phẩy động chính xác kép". Đây là những con số mà chúng tôi sử dụng hầu hết thời gian và chúng tôi sẽ nói về chúng trong chương này

  • Số BigInt đại diện cho số nguyên có độ dài tùy ý. Đôi khi chúng cần thiết vì một số nguyên thông thường không thể an toàn vượt quá

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    6 hoặc nhỏ hơn
    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    7, như chúng tôi đã đề cập trước đó trong chương Các kiểu dữ liệu. Vì bigint được sử dụng trong một số lĩnh vực đặc biệt, chúng tôi dành cho chúng một chương đặc biệt BigInt

  • Vì vậy, ở đây chúng ta sẽ nói về các số thông thường. Hãy mở rộng kiến ​​thức của chúng ta về chúng

    Hãy tưởng tượng chúng ta cần viết 1 tỷ. Cách rõ ràng là

    let billion = 1000000000;

    Chúng ta cũng có thể sử dụng dấu gạch dưới

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    8 làm dấu phân cách

    ________số 8_______

    Ở đây, dấu gạch dưới

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    8 đóng vai trò “đường cú pháp”, nó làm cho số dễ đọc hơn. Công cụ JavaScript chỉ cần bỏ qua
    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    8 giữa các chữ số, vì vậy nó chính xác là một tỷ như trên

    Tuy nhiên, trong cuộc sống thực, chúng tôi cố gắng tránh viết các chuỗi số 0 dài. Chúng tôi quá lười biếng cho việc đó. Chúng tôi sẽ cố gắng viết một cái gì đó như

    let mсs = 0.000001;
    1 cho một tỷ hoặc
    let mсs = 0.000001;
    2 cho 7 tỷ 300 triệu. Điều này cũng đúng với hầu hết các số lớn

    Trong JavaScript, chúng ta có thể rút ngắn một số bằng cách thêm chữ cái

    let mсs = 0.000001;
    3 vào nó và chỉ định số lượng số 0

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)

    Nói cách khác,

    let mсs = 0.000001;
    4 nhân số với
    let mсs = 0.000001;
    5 với số 0 đã cho

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000

    Bây giờ chúng ta hãy viết một cái gì đó rất nhỏ. Nói, 1 micro giây (một phần triệu giây)

    let mсs = 0.000001;

    Giống như trước đây, sử dụng

    let mсs = 0.000001;
    3 có thể giúp. Nếu chúng tôi muốn tránh viết các số 0 một cách rõ ràng, chúng tôi có thể viết giống như

    let mcs = 1e-6; // five zeroes to the left from 1

    Nếu chúng ta đếm các số 0 trong

    let mсs = 0.000001;
    7, thì có 6 số. Vì vậy, tự nhiên nó là
    let mсs = 0.000001;
    8

    Nói cách khác, một số âm sau

    let mсs = 0.000001;
    3 có nghĩa là một phép chia cho 1 với số lượng các chữ số 0 đã cho

    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times

    Số thập lục phân được sử dụng rộng rãi trong JavaScript để thể hiện màu sắc, mã hóa ký tự và cho nhiều thứ khác. Vì vậy, một cách tự nhiên, tồn tại một cách ngắn hơn để viết chúng.

    let mcs = 1e-6; // five zeroes to the left from 1
    0 và sau đó là số

    Ví dụ

    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)

    Các hệ thống số nhị phân và bát phân hiếm khi được sử dụng, nhưng cũng được hỗ trợ bằng cách sử dụng tiền tố

    let mcs = 1e-6; // five zeroes to the left from 1
    1 và
    let mcs = 1e-6; // five zeroes to the left from 1
    2

    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides

    Chỉ có 3 hệ thống số có hỗ trợ như vậy. Đối với các hệ thống số khác, chúng ta nên sử dụng hàm

    let mcs = 1e-6; // five zeroes to the left from 1
    3 (mà chúng ta sẽ thấy ở phần sau của chương này)

    Phương thức

    let mcs = 1e-6; // five zeroes to the left from 1
    4 trả về một chuỗi biểu diễn của
    let mcs = 1e-6; // five zeroes to the left from 1
    5 trong hệ thống số với giá trị đã cho là
    let mcs = 1e-6; // five zeroes to the left from 1
    6

    Ví dụ

    let num = 255;
    
    alert( num.toString(16) );  // ff
    alert( num.toString(2) );   // 11111111

    let mcs = 1e-6; // five zeroes to the left from 1
    6 có thể thay đổi từ
    let mcs = 1e-6; // five zeroes to the left from 1
    8 đến
    let mcs = 1e-6; // five zeroes to the left from 1
    9. Theo mặc định, nó là
    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
    0

    Các trường hợp sử dụng phổ biến cho việc này là

    • base=16 được sử dụng cho màu hex, mã hóa ký tự, v.v., các chữ số có thể là

      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      1 hoặc
      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      2

    • base=2 chủ yếu để gỡ lỗi các hoạt động theo bit, các chữ số có thể là

      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      3 hoặc
      let mсs = 0.000001;
      5

    • base=36 là giá trị lớn nhất, các chữ số có thể là

      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      1 hoặc
      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      6. Toàn bộ bảng chữ cái Latinh được sử dụng để đại diện cho một số. Một trường hợp buồn cười nhưng hữu ích cho
      let mcs = 1e-6; // five zeroes to the left from 1
      9 là khi chúng ta cần biến một mã định danh dài thành một thứ gì đó ngắn hơn, chẳng hạn để tạo một url ngắn. Có thể đơn giản biểu diễn nó trong hệ thống số với cơ số _______20_______9

      let billion = 1_000_000_000;
      0

    Hai dấu chấm để gọi một phương thức

    Xin lưu ý rằng hai dấu chấm trong

    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
    9 không phải là lỗi đánh máy. Nếu chúng ta muốn gọi một phương thức trực tiếp trên một số, chẳng hạn như
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    0 trong ví dụ trên, thì chúng ta cần đặt hai dấu chấm
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    1 sau nó

    Nếu chúng ta đặt một dấu chấm.

    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    2, thì sẽ có lỗi, vì cú pháp JavaScript ngụ ý phần thập phân sau dấu chấm đầu tiên. Và nếu chúng ta đặt thêm một dấu chấm, thì JavaScript sẽ biết rằng phần thập phân trống và bây giờ sẽ chuyển sang phương thức

    Cũng có thể viết

    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    3

    Một trong những phép toán được sử dụng nhiều nhất khi làm việc với số là làm tròn

    Có một số chức năng tích hợp để làm tròn

    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    4Vòng xuống.
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    5 trở thành
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6 và
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    7 trở thành
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    8.
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    9Làm tròn.
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    5 trở thành
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1 và
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    7 trở thành
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3.
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    4Làm tròn đến số nguyên gần nhất.
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    5 trở thành
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6,
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    7 trở thành
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1, trường hợp giữa.
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    9 làm tròn lên tới
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1 nữa.
    let num = 255;
    
    alert( num.toString(16) );  // ff
    alert( num.toString(2) );   // 11111111
    1 (không được Internet Explorer hỗ trợ) Xóa mọi thứ sau dấu thập phân mà không làm tròn.
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    5 trở thành
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6,
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    7 trở thành
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3

    Đây là bảng để tóm tắt sự khác biệt giữa chúng

    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    4
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    9
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    4
    let num = 255;
    
    alert( num.toString(16) );  // ff
    alert( num.toString(2) );   // 11111111
    1
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    5
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    7
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    1
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    7
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    8
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3
    let billion = 1_000_000_000;
    15
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    8
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    8
    let a = 0b11111111; // binary form of 255
    let b = 0o377; // octal form of 255
    
    alert( a == b ); // true, the same number 255 at both sides
    3

    Các chức năng này bao gồm tất cả các cách có thể để xử lý phần thập phân của một số. Nhưng nếu chúng ta muốn làm tròn số thành

    let billion = 1_000_000_000;
    20 chữ số sau dấu thập phân thì sao?

    Chẳng hạn, chúng tôi có

    let billion = 1_000_000_000;
    21 và muốn làm tròn nó thành 2 chữ số, chỉ nhận được
    let billion = 1_000_000_000;
    22

    Có hai cách để làm như vậy

    1. Nhân và chia

      Ví dụ, để làm tròn số đến chữ số thứ 2 sau dấu thập phân, chúng ta có thể nhân số đó với

      let billion = 1_000_000_000;
      23, gọi hàm làm tròn rồi chia lại

      let billion = 1_000_000_000;
      1

    2. Phương thức toFixed(n) làm tròn số thành

      let billion = 1_000_000_000;
      24 chữ số sau dấu chấm và trả về một chuỗi biểu diễn kết quả

      let billion = 1_000_000_000;
      2

      Điều này làm tròn lên hoặc xuống đến giá trị gần nhất, tương tự như

      let a = 0b11111111; // binary form of 255
      let b = 0o377; // octal form of 255
      
      alert( a == b ); // true, the same number 255 at both sides
      4

      let billion = 1_000_000_000;
      3

      Xin lưu ý rằng kết quả của

      let billion = 1_000_000_000;
      26 là một chuỗi. Nếu phần thập phân ngắn hơn yêu cầu, các số 0 sẽ được thêm vào cuối

      let billion = 1_000_000_000;
      4

      Chúng tôi có thể chuyển đổi nó thành một số bằng cách sử dụng phép cộng đơn nguyên hoặc cuộc gọi

      let billion = 1_000_000_000;
      27, e. g viết
      let billion = 1_000_000_000;
      28

    Bên trong, một số được thể hiện ở định dạng 64 bit IEEE-754, do đó, có chính xác 64 bit để lưu trữ một số. 52 trong số chúng được sử dụng để lưu trữ các chữ số, 11 trong số chúng lưu trữ vị trí của dấu thập phân và 1 bit dành cho dấu

    Nếu một số thực sự lớn, nó có thể tràn bộ nhớ 64-bit và trở thành một giá trị số đặc biệt

    let billion = 1_000_000_000;
    29

    let billion = 1_000_000_000;
    5

    Điều có thể ít rõ ràng hơn một chút, nhưng xảy ra khá thường xuyên, đó là sự mất chính xác

    Hãy xem xét điều này (giả. ) kiểm tra bình đẳng

    let billion = 1_000_000_000;
    6

    Đúng vậy, nếu chúng ta kiểm tra xem tổng của

    let billion = 1_000_000_000;
    30 và
    let billion = 1_000_000_000;
    31 có phải là
    let billion = 1_000_000_000;
    32 hay không, chúng ta sẽ nhận được
    let billion = 1_000_000_000;
    33

    Lạ lùng. Vậy thì nó là gì nếu không phải là

    let billion = 1_000_000_000;
    32?

    let billion = 1_000_000_000;
    7

    ôi. Hãy tưởng tượng bạn đang tạo một trang web mua sắm điện tử và khách truy cập đặt hàng hóa

    let billion = 1_000_000_000;
    35 và
    let billion = 1_000_000_000;
    36 vào giỏ hàng của họ. Tổng đơn hàng sẽ là
    let billion = 1_000_000_000;
    37. Điều đó sẽ làm bất ngờ bất cứ ai

    Nhưng tại sao điều này lại xảy ra?

    Một số được lưu trữ trong bộ nhớ ở dạng nhị phân, một chuỗi các bit – số đơn vị và số không. Nhưng các phân số như

    let billion = 1_000_000_000;
    30,
    let billion = 1_000_000_000;
    31 trông có vẻ đơn giản trong hệ thống số thập phân thực ra là các phân số vô tận ở dạng nhị phân của chúng

    let billion = 1_000_000_000;
    30 là gì? . Trong hệ thống số thập phân, những số như vậy có thể dễ dàng biểu diễn. So sánh nó với một phần ba.
    let billion = 1_000_000_000;
    42. Nó trở thành một phân số vô tận
    let billion = 1_000_000_000;
    43

    Vì vậy, phép chia cho lũy thừa

    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
    0 được đảm bảo hoạt động tốt trong hệ thập phân, nhưng phép chia cho
    alert( 0xff ); // 255
    alert( 0xFF ); // 255 (the same, case doesn't matter)
    6 thì không. Vì lý do tương tự, trong hệ thống số nhị phân, phép chia cho lũy thừa của
    let mcs = 1e-6; // five zeroes to the left from 1
    8 được đảm bảo hoạt động, nhưng
    let billion = 1_000_000_000;
    41 trở thành một phân số nhị phân vô tận

    Không có cách nào để lưu trữ chính xác 0. 1 hoặc chính xác là 0. 2 bằng hệ thống nhị phân, giống như không có cách nào để lưu trữ một phần ba dưới dạng phân số thập phân

    Định dạng số IEEE-754 giải quyết vấn đề này bằng cách làm tròn đến số gần nhất có thể. Các quy tắc làm tròn này thường không cho phép chúng ta nhìn thấy "độ mất chính xác nhỏ" đó, nhưng nó tồn tại

    Chúng ta có thể thấy điều này trong hành động

    let billion = 1_000_000_000;
    8

    Và khi chúng ta tính tổng hai số, "tổn thất chính xác" của chúng cộng lại

    Đó là lý do tại sao

    let billion = 1_000_000_000;
    48 không chính xác là
    let billion = 1_000_000_000;
    32

    Không chỉ JavaScript

    Vấn đề tương tự tồn tại ở nhiều ngôn ngữ lập trình khác

    PHP, Java, C, Perl, Ruby cho kết quả chính xác như nhau, bởi vì chúng dựa trên cùng một định dạng số

    Chúng ta có thể giải quyết vấn đề không?

    let billion = 1_000_000_000;
    9

    Xin lưu ý rằng

    let billion = 1_000_000_000;
    26 luôn trả về một chuỗi. Nó đảm bảo rằng nó có 2 chữ số sau dấu thập phân. Điều đó thực sự tiện lợi nếu chúng ta có một trang mua sắm điện tử và cần hiển thị
    let billion = 1_000_000_000;
    51. Đối với các trường hợp khác, chúng ta có thể sử dụng phép cộng đơn vị để biến nó thành một số

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    0

    Chúng ta cũng có thể tạm thời nhân các số với 100 (hoặc một số lớn hơn) để biến chúng thành số nguyên, làm phép tính rồi chia lại. Sau đó, khi chúng ta làm toán với các số nguyên, sai số giảm đi phần nào, nhưng chúng ta vẫn mắc lỗi khi chia

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    1

    Vì vậy, phương pháp nhân/chia giúp giảm lỗi, nhưng không loại bỏ hoàn toàn

    Đôi khi chúng ta có thể cố gắng trốn tránh các phân số. Giống như nếu chúng ta đang giao dịch với một cửa hàng, thì chúng ta có thể lưu trữ giá bằng xu thay vì đô la. Nhưng nếu chúng tôi áp dụng giảm giá 30% thì sao? . Chỉ cần làm tròn chúng để cắt “đuôi” khi cần thiết

    điều buồn cười

    Hãy thử chạy cái này

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    2

    Điều này bị cùng một vấn đề. mất độ chính xác. Có 64 bit cho số, 52 trong số đó có thể được sử dụng để lưu trữ các chữ số, nhưng điều đó là không đủ. Vì vậy, các chữ số ít quan trọng nhất biến mất

    JavaScript không gây ra lỗi trong các sự kiện như vậy. Nó cố gắng hết sức để khớp số vào định dạng mong muốn, nhưng thật không may, định dạng này không đủ lớn

    hai số 0

    Một hệ quả buồn cười khác của biểu diễn bên trong các số là sự tồn tại của hai số không.

    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
    3 và
    let billion = 1_000_000_000;
    53

    Đó là bởi vì một dấu hiệu được biểu thị bằng một bit duy nhất, do đó, nó có thể được đặt hoặc không được đặt cho bất kỳ số nào kể cả số không

    Trong hầu hết các trường hợp, sự khác biệt là không đáng chú ý, bởi vì các toán tử phù hợp để coi chúng như nhau.

    Hãy nhớ hai giá trị số đặc biệt này?

    • let billion = 1_000_000_000;
      29 (và
      let billion = 1_000_000_000;
      55) là một giá trị số đặc biệt lớn hơn (nhỏ hơn) bất kỳ giá trị nào
    • let billion = 1_000_000_000;
      56 đại diện cho một lỗi

    Chúng thuộc loại

    let billion = 1_000_000_000;
    57, nhưng không phải là số “bình thường”, vì vậy có các chức năng đặc biệt để kiểm tra chúng

    • let billion = 1_000_000_000;
      58 chuyển đổi đối số của nó thành một số và sau đó kiểm tra xem nó có phải là
      let billion = 1_000_000_000;
      56

      let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
      
      alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
      3

      Nhưng chúng ta có cần chức năng này không? . Giá trị

      let billion = 1_000_000_000;
      56 là duy nhất ở chỗ nó không bằng bất cứ thứ gì, kể cả chính nó

      let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
      
      alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
      4

    • let billion = 1_000_000_000;
      62 chuyển đổi đối số của nó thành một số và trả về
      let billion = 1_000_000_000;
      63 nếu đó là một số thông thường, không phải là
      let billion = 1_000_000_000;
      64

      let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
      
      alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
      5

    Đôi khi,

    let billion = 1_000_000_000;
    65 được sử dụng để xác thực xem giá trị chuỗi có phải là số thông thường hay không

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    6

    Xin lưu ý rằng một chuỗi trống hoặc chỉ có khoảng trắng được coi là

    // -3 divides by 1 with 3 zeroes
    1e-3 === 1 / 1000; // 0.001
    
    // -6 divides by 1 with 6 zeroes
    1.23e-6 === 1.23 / 1000000; // 0.00000123
    
    // an example with a bigger number
    1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
    3 trong tất cả các hàm số bao gồm
    let billion = 1_000_000_000;
    65

    let billion = 1_000_000_000;
    68 và
    let billion = 1_000_000_000;
    69

    Số. isNaN và số. Các phương thức isFinite là các phiên bản "nghiêm ngặt" hơn của các hàm

    let billion = 1_000_000_000;
    70 và
    let billion = 1_000_000_000;
    65. Họ không tự động chuyển đổi đối số của mình thành một số, nhưng thay vào đó hãy kiểm tra xem nó có thuộc loại
    let billion = 1_000_000_000;
    57 không

    • let billion = 1_000_000_000;
      73 trả về
      let billion = 1_000_000_000;
      63 nếu đối số thuộc loại
      let billion = 1_000_000_000;
      57 và nó là
      let billion = 1_000_000_000;
      56. Trong mọi trường hợp khác, nó trả về
      let billion = 1_000_000_000;
      33

      let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
      
      alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
      7

    • let billion = 1_000_000_000;
      78 trả về
      let billion = 1_000_000_000;
      63 nếu đối số thuộc loại
      let billion = 1_000_000_000;
      57 và nó không phải là
      let billion = 1_000_000_000;
      64. Trong mọi trường hợp khác, nó trả về
      let billion = 1_000_000_000;
      33

      let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
      
      alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
      8

    Theo một cách nào đó,

    let billion = 1_000_000_000;
    68 và
    let billion = 1_000_000_000;
    69 đơn giản và dễ hiểu hơn các hàm
    let billion = 1_000_000_000;
    70 và
    let billion = 1_000_000_000;
    65. Tuy nhiên, trong thực tế,
    let billion = 1_000_000_000;
    70 và
    let billion = 1_000_000_000;
    65 hầu hết được sử dụng, vì chúng ngắn hơn để viết

    So sánh với

    let billion = 1_000_000_000;
    89

    Có một phương pháp tích hợp đặc biệt

    let billion = 1_000_000_000;
    89 so sánh các giá trị như
    let billion = 1_000_000_000;
    91, nhưng đáng tin cậy hơn cho hai trường hợp cạnh

    1. Nó hoạt động với
      let billion = 1_000_000_000;
      56.
      let billion = 1_000_000_000;
      93, đó là một điều tốt
    2. Các giá trị
      // -3 divides by 1 with 3 zeroes
      1e-3 === 1 / 1000; // 0.001
      
      // -6 divides by 1 with 6 zeroes
      1.23e-6 === 1.23 / 1000000; // 0.00000123
      
      // an example with a bigger number
      1234e-2 === 1234 / 100; // 12.34, decimal point moves 2 times
      3 và
      let billion = 1_000_000_000;
      53 khác nhau.
      let billion = 1_000_000_000;
      96, về mặt kỹ thuật thì đúng, bởi vì bên trong số có một bit dấu có thể khác ngay cả khi tất cả các bit khác đều là số 0

    Trong tất cả các trường hợp khác,

    let billion = 1_000_000_000;
    97 giống như
    let billion = 1_000_000_000;
    98

    Chúng tôi đề cập đến

    let billion = 1_000_000_000;
    89 ở đây, vì nó thường được sử dụng trong đặc tả JavaScript. Khi một thuật toán nội bộ cần so sánh hai giá trị có giống nhau hoàn toàn không, nó sẽ sử dụng
    let billion = 1_000_000_000;
    89 (được gọi nội bộ là )

    Chuyển đổi số bằng cách sử dụng dấu cộng

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    01 hoặc
    let billion = 1_000_000_000;
    27 là nghiêm ngặt. Nếu một giá trị không chính xác là một số, nó sẽ thất bại

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    9

    Ngoại lệ duy nhất là khoảng trắng ở đầu hoặc cuối chuỗi, vì chúng bị bỏ qua

    Nhưng trong cuộc sống thực, chúng ta thường có các giá trị theo đơn vị, như

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    03 hoặc
    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    04 trong CSS. Ngoài ra, ở nhiều quốc gia, ký hiệu tiền tệ đi sau số tiền, vì vậy chúng tôi có
    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    05 và muốn trích xuất một giá trị số từ đó

    Đó là những gì mà

    let mcs = 1e-6; // five zeroes to the left from 1
    3 và
    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    07 dành cho

    Họ “đọc” một số từ một chuỗi cho đến khi họ không thể. Trong trường hợp có lỗi, số đã thu thập được trả về. Hàm

    let mcs = 1e-6; // five zeroes to the left from 1
    3 trả về một số nguyên, trong khi hàm
    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    07 sẽ trả về một số dấu phẩy động

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    0

    Có những tình huống khi

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    10 sẽ trở lại
    let billion = 1_000_000_000;
    56. Nó xảy ra khi không có chữ số nào có thể đọc được

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    1

    Đối số thứ hai của

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    12

    Hàm

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    13 có tham số thứ hai tùy chọn. Nó chỉ định cơ sở của hệ thống số, vì vậy,
    let mcs = 1e-6; // five zeroes to the left from 1
    3 cũng có thể phân tích cú pháp các chuỗi số hex, số nhị phân, v.v.

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    2

    JavaScript có một đối tượng Math tích hợp chứa một thư viện nhỏ các hàm và hằng số toán học

    Một vài ví dụ

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    15

    Trả về một số ngẫu nhiên từ 0 đến 1 (không bao gồm 1)

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    3

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    16 và
    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    17

    Trả về giá trị lớn nhất và nhỏ nhất từ ​​số lượng đối số tùy ý

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    4

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    18

    Trả về

    let billion = 1_000_000_000;
    24 nâng lên lũy thừa đã cho

    1e3 === 1 * 1000; // e3 means *1000
    1.23e6 === 1.23 * 1000000; // e6 means *1000000
    5

    Có nhiều hàm và hằng số hơn trong đối tượng

    let billion = 1e9;  // 1 billion, literally: 1 and 9 zeroes
    
    alert( 7.3e9 );  // 7.3 billions (same as 7300000000 or 7_300_000_000)
    20, bao gồm lượng giác, mà bạn có thể tìm thấy trong tài liệu dành cho đối tượng Math

    Làm cách nào để kiểm tra toàn bộ số trong js?

    Số . phương thức isInteger() trả về true nếu một giá trị là số nguyên của kiểu dữ liệu Number. Nếu không nó trả về false.

    Làm cách nào để kiểm tra xem thứ gì đó có phải là số nguyên JavaScript không?

    isInteger() Số. Phương thức tĩnh isInteger() xác định xem giá trị được truyền có phải là số nguyên hay không.