Helpex - Trao đổi & giúp đỡ Đăng nhập

Cách hiển thị số trong JavaScript

Bài đăng trên blog này giải thích cách JavaScript hiển thị số. Nó cũng kiểm tra khi JavaScript sử dụng ký hiệu số mũ và khi nó sử dụng ký hiệu cố định.

Bài đăng này là một phần của loạt bài về các số JavaScript hiện bao gồm các bài đăng khác sau:

Hiển thị số thập phân

Số JavaScript được lưu trữ nội bộ trong dấu phẩy động nhị phân. Nhưng chúng thường được hiển thị trong hệ thống thập phân.

Đã sửa ký hiệu so với ký hiệu số mũ

Có hai ký hiệu thập phân được sử dụng bởi JavaScript: Ký hiệu cố định

["+" | "-"] chữ số + ["." chữ số +]

và ký hiệu số mũ

["+" | "-"] chữ số ["." chữ số +] "e" ["+" | "-"] chữ số +

Một ví dụ về ký hiệu số mũ là -1,37e + 2. Đối với đầu ra, luôn có chính xác một chữ số trước điểm, đối với đầu vào, bạn có thể sử dụng nhiều hơn một chữ số. Ký hiệu số mũ được hiểu như sau: Cho một số trong ký hiệu số mũ

    <em>significand</em> e <em>exponent</em>

Giá trị của số đó là

đáng kể × 10 số mũ

Do đó, -1,37e + 2 đại diện cho số 37137.

Hiển thị số thập phân

Các quy tắc để hiển thị số có thể được tóm tắt như sau:

  • Sử dụng ký hiệu số mũ nếu có nhiều hơn 21 chữ số trước dấu thập phân. Thí dụ:

    > 1234567890123456789012
        1.2345678901234568e+21
        > 123456789012345678901
        123456789012345680000
  • Sử dụng ký hiệu số mũ nếu số bắt đầu bằng Số 0. Tiếp theo là hơn năm số không. Thí dụ:

        > 0.0000003
        3e-7
        > 0.000003
        0.000003
  • Nếu không, sử dụng ký hiệu cố định.

Đọc tiếp nếu bạn muốn biết thêm về cách hiển thị số được chỉ định.

Thuật toán hiển thị ECMAScript 5.1 một cách chi tiết

Giáo phái. 9.8.1 của đặc tả ECMAScript 5.1 mô tả thuật toán để hiển thị số thập phân. Phần này giải thích nó. Trước tiên chúng ta cần đưa ra một vài định nghĩa sơ bộ.

Định nghĩa sơ bộ

Các mantissa của một số dấu chấm động là một số nguyên - những con số đáng kể cộng với một dấu hiệu. Số không hàng đầu và dấu vết được loại bỏ. Ví dụ:

  • Lớp phủ của 12,34 là 1234.
  • Giá trị của 0,00045 là 45
  • Lớp phủ của 1000 là 1
  • Lớp phủ của −27 là −27

Ý tưởng chung là bạn chỉ cần số nguyên nếu bạn lưu trữ số dấu phẩy động dưới dạng một cặp (mantissa, số mũ), để được giải thích như sau:

mantissa × 10 số mũ

Đặc tả ECMAScript thay đổi ý tưởng này bằng cách thể hiện một số là

mantissa × 10 pointPos − chữ sốCount

Do đó, số mũ trước đó bây giờ là pointPos − chữ sốCount. chữ sốCount biểu thị chiều dài của người dùng của mantissa, số chữ số mà nó có. Dựa trên định nghĩa đó, pointPos hoạt động như sau.

  • pointPos = 0: điểm nằm trước các chữ số.

        > 123 * Math.pow(10, 0 - 3)
        0.123
    
  • pointPos 1: điểm nằm sau chữ số 1 (2, v.v.). Nếu pointPos nhỏ hơn chữ sốCount thì điểm đó sẽ xuất hiện bên trong hình chữ nhật:

        > 123 * Math.pow(10, 1 - 3)
        1.23
    

    Nếu pointPos giống như DigitCount thì điểm xuất hiện sau chữ số cuối cùng của lớp phủ.

        > 123 * Math.pow(10, 3 - 3)
        123
    

    Nếu pointPos lớn hơn DigitCount thì các số 0 được chèn sau lớp phủ và trước điểm.

        > 123 * Math.pow(10, 5 - 3)
        12300
    
  • các số 0 pointPos ≤ 1: một (hai, v.v.) xuất hiện sau điểm và trước lớp phủ.
        > 123 * Math.pow(10, -2 - 3)
        0.00123
  •  

Thuật toán

Cho một số

mantissa × 10 pointPos − chữ sốCount

Thuật toán có bốn trường hợp chính (ở đây, trường hợp cuối cùng hợp nhất hai trường hợp cuối cùng của thuật toán thực tế).

  1. Không có dấu thập phân: DigitCount pointPos 21
    In các chữ số (không có các số 0 đứng đầu), theo sau là các số 0 pointPos − chữ sốCount.

  2. Điểm thập phân bên trong lớp phủ: 0
    Hiển thị các chữ số đầu tiên của pointPos của mantissa, một điểm và sau đó là các chữ số DigitCount pointPos còn lại.

  3. Điểm thập phân xuất hiện trước lớp phủ: −6
    Hiển thị số 0 theo sau là một điểm, −pointPos số không và lớp phủ.

  4. Ký hiệu số mũ: pointPos -6 hoặc pointPos> 21
    Hiển thị chữ số đầu tiên của lớp phủ. Nếu có nhiều chữ số hơn thì hiển thị một điểm và các chữ số còn lại. Tiếp theo, hiển thị ký tự e và dấu cộng hoặc dấu trừ (tùy thuộc vào dấu của pointPos − 1), theo sau là giá trị tuyệt đối của pointPos 1. Do đó, kết quả trông như sau.

  5. mantissa 0 ["." mantissa 1..digitCount ]
    "e" signChar (pointPos 1) abs (pointPos 1)

Phương thức chuyển đổi số thành chuỗi

Việc chuyển đổi này thường là một bước sơ bộ để hiển thị một số: Chuyển đổi số thành một chuỗi mà trông có vẻ như mong muốn và sau đó hiển thị nó ở đâu đó.

Number.prototype.toString (cơ số?)

Cơ số tham số cho biết cơ sở của hệ thống trong đó số sẽ được hiển thị. Các radice phổ biến nhất là 10 (thập phân), 2 (nhị phân) và 16 (thập lục phân).

    > 15..toString(2)
    '1111'
    > 65535..toString(16)
    'ffff'

Cơ số phải có ít nhất 2 và nhiều nhất là 36. Bất kỳ cơ số nào lớn hơn 10 dẫn đến các ký tự chữ cái được sử dụng làm chữ số, giải thích tối đa 36, ​​vì bảng chữ cái Latin có 26 ký tự.

    > 1234567890..toString(36)
    'kf12oi'

Hàm parseInt toàn cầu cho phép bạn chuyển đổi các ký hiệu đó thành số:

    > parseInt('kf12oi', 36)
    1234567890

Nếu cơ số là 10, thuật toán từ Sect. 1 được sử dụng để chuyển đổi số thành chuỗi.

Number.prototype.toExponential (phân số kỹ thuật số?)

Phương pháp này buộc một số được thể hiện bằng ký hiệu số mũ. phân số là một số từ 0 đến 20 xác định có bao nhiêu chữ số sẽ được hiển thị sau dấu thập phân. Nếu nó bị bỏ qua thì có bao gồm nhiều chữ số có nghĩa và [mantissa] khi cần thiết để chỉ định duy nhất Số lượng (đặc tả ECMAScript 5.1, Phần 15.7.4.6). Sau đây là một vài ví dụ.

Buộc chính xác hơn khi toString () cũng sẽ sử dụng ký hiệu số mũ. Kết quả là hỗn hợp, bởi vì người ta đạt đến giới hạn của độ chính xác có thể đạt được khi chuyển đổi số nhị phân thành ký hiệu thập phân.

    > 1234567890123456789012..toString()
    '1.2345678901234568e+21'

    > 1234567890123456789012..toExponential(20)
    '1.23456789012345677414e+21'

Nhận ký hiệu số mũ khi số không đủ lớn.

    > 1234..toString()
    '1234'

    > 1234..toExponential(5)
    '1.23400e+3'

    > 1234..toExponential()
    '1.234e+3'

Nhận ký hiệu số mũ khi các số khác không đủ nhỏ.

    > 0.003.toString()
    '0.003'

    > 0.003.toExponential(4)
    '3.0000e-3'

    > 0.003.toExponential()
    '3e-3'

Number.prototype.toFixed (phân số?)

Nếu số lớn hơn 10 21 thì phương thức này giống như toString (). Do đó, bạn không được đảm bảo không nhận được một số trong ký hiệu số mũ.
    > 1234567890123456789012..toFixed()
    '1.2345678901234568e+21'

    > 1234567890123456789012..toString()
    '1.2345678901234568e+21'
Nếu không, bạn sẽ nhận được một đại diện điểm cố định của số, được làm tròn thành chữ số phân số. Nếu tham số bị bỏ qua, giá trị 0 được sử dụng.
    > 0.0000003.toFixed(10)
    '0.0000003000'

    > 0.0000003.toString()
    '3e-7'

Number.prototype.toPrecision (độ chính xác?)

Phương pháp này cắt mantissa thành các chữ số chính xác, trước khi sử dụng thuật toán chuyển đổi tương tự như toString (). Nếu không có độ chính xác nào được đưa ra, toString () được sử dụng trực tiếp.
    > 1234..toPrecision(3)
    '1.23e+3'
    
    > 1234..toPrecision(4)
    '1234'

    > 1234..toPrecision(5)
    '1234.0'
    
    > 1.234.toPrecision(3)
    '1.23'
Rõ ràng, bạn cần ký hiệu số mũ để hiển thị 1234 với độ chính xác là 3 chữ số.

Phần kết luận

Bài đăng này mô tả cách hiển thị số JavaScript. Mặc dù biểu diễn bên trong của chúng là nhị phân, mặc định để hiển thị chúng là số thập phân. Mất kết quả chính xác là có vấn đề và sẽ là chủ đề của một bài đăng blog sắp tới. Bạn cũng đã học được rằng JavaScript sử dụng ký hiệu cố định ngoại trừ các số lớn hơn 10 21 và các số bắt đầu bằng chữ 0. 0. theo sau là hơn 5 số không.

Thật thú vị khi lưu ý rằng bạn luôn có thể nối e x vào một số và nó sẽ được nhân với 10 x .

    > 123e3
    123000
    > 123e-3
    0.123
6 hữu ích 0 bình luận 4.9k xem chia sẻ

Có thể bạn quan tâm

loading