Bản tóm tắt. 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 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'
00 không được xác định, nó sẽ quay trở lạiCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
01Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
Nếu bạn không chuyển bất kỳ đối số nào cho
02, nó sẽ trả vềCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
03Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
Khi bạn sử dụng hàm
04, bạn sẽ thấy rằng sốCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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 Python đại diện cho
4 bên trong như thế nào, bạn có thể sử dụng hàmCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
09Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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'
32Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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
0Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
đầu ra
3Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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ố
33 và
>>> format[0.1, '.20f'] '0.10000000000000000555'
Code language: JavaScript [javascript]
34Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
8Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
đầu ra
9Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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ụ
0Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
đầu ra
1Code language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
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
35 từ mô-đunCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
36 trả vềCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'
37 nếu hai số tương đối gần nhauCode language: JavaScript [javascript]
>>> format[0.1, '.20f'] '0.10000000000000000555'