Tóm lược. trong hướng dẫn này, bạn sẽ tìm hiểu về kiểu float của Python, cách Python biểu thị các số dấu phẩy động và cách kiểm tra sự bằng nhau của số dấu phẩy động
Giới thiệu về kiểu float trong Python
Python sử dụng lớp
1 để biểu diễn các số thựcCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
CPython thực hiện float bằng cách sử dụng loại kép C. Loại kép C thường triển khai float nhị phân độ chính xác kép IEEE 754, còn được gọi là binary64
Python float sử dụng 8 byte [hoặc 64 bit] để biểu diễn số thực. Không giống như kiểu số nguyên, kiểu float sử dụng một số byte cố định
Về mặt kỹ thuật, Python sử dụng 64 bit như sau
- 1 bit cho dấu [dương hoặc âm]
- 11 bit cho số mũ 1. 5e-5 1. 5 x 10-5 [số mũ là
2] phạm vi là
Code language: JavaScript [javascript]>>> format[0.1, '.20f'] '0.10000000000000000555'
3
Code language: JavaScript [javascript]>>> format[0.1, '.20f'] '0.10000000000000000555'
- 52 bit cho chữ số có nghĩa
Để đơn giản, các chữ số có nghĩa là tất cả các chữ số trừ các số 0 ở đầu và cuối
Ví dụ: 0. 25 có hai chữ số có nghĩa là 0. 125 có ba chữ số có nghĩa và 12. 25 có 4 chữ số có nghĩa
[1. 25]10 = [1×20 + 0x2-1 + 1×2-2]10 = [1. 01]2
Một số số có biểu diễn nhị phân hữu hạn, nhưng một số thì không, e. g. ,
4. Đó làCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
5 ở dạng nhị phânCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
Do đó, Python chỉ có thể sử dụng các biểu diễn float gần đúng cho các số đó
lớp float Python
6 trả về một số dấu phẩy động dựa trên một số hoặc một chuỗi. Ví dụ
>>> format[0.1, '.20f'] '0.10000000000000000555'
Code language: JavaScript [javascript]
Code language: JavaScript [javascript]
>>> float[0.1] 0.1 >>> float['1.25'] 1.25
Nếu bạn chuyển một đối tượng [
7] choCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
8, nó sẽ ủy quyền choCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
9. NếuCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
0 không được xác định, nó sẽ quay trở lạiCode language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
1Code language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
Nếu bạn không chuyển bất kỳ đối số nào cho
2, nó sẽ trả vềCode language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
3Code language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
Khi bạn sử dụng hàm
4, bạn sẽ thấy rằng sốCode language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
4 được biểu thị chính xác làCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
4Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
Trong nội bộ, Python chỉ có thể đại diện cho khoảng
4
>>> format[0.1, '.20f'] '0.10000000000000000555'
Code language: JavaScript [javascript]
Để xem cách Python đại diện cho
4 bên trong, bạn có thể sử dụng hàmCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
9Code language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
Phần sau đây cho thấy cách Python đại diện cho số 0. 1 sử dụng 20 chữ số
Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
Như bạn có thể thấy,
4 không chính xác làCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
4 mà làCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
2Code language: PHP [php]
False
Bởi vì Python có thể đại diện cho một số số float, nó sẽ gây ra nhiều vấn đề khi bạn so sánh hai số dấu phẩy động
kiểm tra bình đẳng
Hãy cùng xem ví dụ sau
Code language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[x == y]
đầu ra
Code language: PHP [php]
False
Bên trong, Python không thể sử dụng một số chữ số hữu hạn để biểu diễn các số
3 và
False
Code language: PHP [php]
4Code language: PHP [php]
False
Code language: PHP [php]
print[format[x, '.20f']] print[format[y, '.20f']]
đầu ra
Code language: CSS [css]
0.30000000000000004441 0.29999999999999998890
Lưu ý rằng số chữ số là vô hạn. Chúng tôi chỉ hiển thị 20 chữ số đầu tiên
Một cách để giải quyết vấn đề này là làm tròn cả hai vế của biểu thức đẳng thức thành một số chữ số có nghĩa. Ví dụ
Code language: PHP [php]
x = 0.1 + 0.1 + 0.1 y = 0.3 print[round[x, 3] == round[y, 3]]
đầu ra
Code language: PHP [php]
True
Cách giải quyết này không hoạt động trong mọi trường hợp
PEP485 cung cấp giải pháp khắc phục sự cố này bằng cách sử dụng dung sai tương đối và tuyệt đối
Nó cung cấp hàm
5 từ mô-đunCode language: PHP [php]
False
6 trả vềCode language: PHP [php]
False
7 nếu hai số tương đối gần nhauCode language: PHP [php]
False