2015-03-17 30 views
5

Đã chơi xung quanh với JS và nhận thấy điều này.parseInt() ký pháp khoa học

Tại sao parseInt(1e+21) trả lại 1parseInt(1e+20) trả lại 100000000000000000000? parseInt(10e+20) cũng trả lại 1?

Tại sao parseInt(1.7976931348623157E+10308); trả lại NaN trong khi parseFloat(1.7976931348623157E+10308) trả về Infinity?


Ngay cả làm một dãy Fibonacci và bất kỳ giá trị mà có +21 số mũ chỉ trả về chữ số đầu tiên:

fibonacci sequence scientific notation

parseFloat() sẽ trở lại con số chính xác đến Infinity.

Fibonacci demo (int : parseInt() : parseFloat())

(thử nghiệm trong Chrome)

Trả lời

3

parseIntparseFloat có nghĩa vụ phải phân tích chuỗi và chuyển đổi chúng sang Number s. Vì vậy, khi bạn vượt qua chúng một số Number, nó sẽ bị người phiên dịch buộc phải chuỗi. Vì vậy, ít nhất trong Firefox, các kết quả đầu ra "" + 1e+20"100000000000000000000""" + 1e+21 kết quả đầu ra "1e+21".

Hãy đọc the documentation của parseInt:

Nếu parseInt gặp một nhân vật đó không phải là một số trong radix chỉ định, nó bỏ qua nó và tất cả các nhân vật thành công và trả về giá trị số nguyên được phân tích đến thời điểm đó

nên parseInt("1.whatever") lợi nhuận 1parseInt("32.231e+something") lợi nhuận 32.

Một điều tương tự phải happeni ng với parseFloat.

Đó là lỗi đánh máy yếu. IMO hành vi chính xác khi làm những gì bạn làm sẽ là ném một ngoại lệ.

+0

Tại sao parseInt (1e + 20) trả về 100000000000000000000 và không phải 1 thì? – rottenoats

+0

Tôi đã nói rồi. Khi '1e + 20' bị ép buộc thành một chuỗi, nó xuất ra' "100000000000000000000" ', được phân tích cú pháp' thành số chính xác. '1e + 21' xuất ra' "1e + 21" 'thay thế. Hãy thử số tiền "" + tôi đã viết trong câu trả lời. – rhaps0dy

+0

Tôi đã làm. Các đầu ra parseInt ("" + 1e + 21) 1 – rottenoats

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