Câu trả lời cho điều này là "đáng ngạc nhiên" đơn giản:
Đầu tiên - như hầu hết các bạn có thể biết - một 32-bit số nguyên dao động từ -2147483648 đến 2,147,483,647 . Vì vậy, điều gì xảy ra nếu PHP có kết quả, đó là LARGER hơn thế này?
Thông thường, người ta sẽ mong đợi một "Tràn" ngay lập tức, khiến 2.147.483.647 + 1 biến thành −2,147,483,648 . Tuy nhiên, đó không phải là trường hợp. NẾU PHP gặp một số lượng lớn hơn, nó trả về FLOAT thay vì INT.
Nếu PHP gặp một số nằm ngoài giới hạn của kiểu số nguyên, thì nó sẽ được hiểu là một số float thay thế. Ngoài ra, một hoạt động dẫn đến một số vượt quá giới hạn của loại số nguyên sẽ trả về một số float thay thế.
http://php.net/manual/en/lingu.types.integer.php
Điều này đã nói và biết rằng việc triển khai FLOAT của PHP đang tuân theo Định dạng chính xác kép của IEEE 754, có nghĩa là PHP có thể xử lý các con số lên tới 52 bit mà không mất độ chính xác. (Trên hệ thống 32 bit)
Vì vậy, tại Điểm, khi Sum của bạn đạt 9,007,199,254,740,992 (tức là 2 ^ 53 ) Giá trị Float được trả về bởi các Toán học PHP sẽ không còn đủ chính xác nữa.
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000000\"); echo number_format($x,0);"
9,007,199,254,740,992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000001\"); echo number_format($x,0);"
9,007,199,254,740,992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000010\"); echo number_format($x,0);"
9,007,199,254,740,994
Ví dụ này cho thấy Điểm, trong đó PHP mất độ chính xác. Đầu tiên, bit có ý nghĩa cuối cùng sẽ bị loại bỏ, khiến 2 biểu thức đầu tiên dẫn đến một số bằng nhau - mà chúng không có.
Từ NGAY BÂY GIỜ, toàn bộ toán học sẽ sai, khi làm việc với các kiểu dữ liệu mặc định.
• Đây có phải là cùng một vấn đề đối với ngôn ngữ được giải thích khác như Python hoặc Perl không?
Tôi không nghĩ vậy. Tôi nghĩ rằng đây là vấn đề của các ngôn ngữ không có loại an toàn. Mặc dù tràn số nguyên như đã đề cập ở trên SILL xảy ra ở mọi ngôn ngữ sử dụng các loại dữ liệu cố định, các ngôn ngữ không có loại an toàn có thể cố gắng nắm bắt điều này với các kiểu dữ liệu khác. Tuy nhiên, một khi họ đạt được Biên giới "tự nhiên" (do hệ thống) - họ có thể trả lại bất cứ điều gì, nhưng kết quả đúng.
Tuy nhiên, mỗi ngôn ngữ có thể có các luồng khác nhau cho một Kịch bản như vậy.