Câu 1Đoạn code này in gì?
print(type(10 / 2))
Số nguyên và số thực (float)
Học cách dùng kiểu số int và float trong Python: phép chia, lũy thừa, gán tổ hợp và độ chính xác của số thực.
Python có hai kiểu số
Python có hai kiểu số chính để làm việc với số: int cho số nguyên và float cho số thập phân.
Cả hai đều là số, nên bạn có thể làm mọi phép tính cơ bản — cộng, trừ, nhân, chia và chia dư — với cái nào cũng được.
Nhưng cú pháp và độ chính xác khác nhau, nên bạn chọn cái phù hợp cho mỗi tình huống.
Viết không có . thì bạn có int.
Viết có . thì bạn có float.
Dù thế nào, type() cũng cho bạn biết mình đang có cái nào.
Dù giá trị trông giống số nguyên, thêm .0 như 3.0 biến nó thành float. Ngược lại, chỉ viết 175 thì nó là int.
Số âm cũng làm việc tương tự — -5 là int, -5.5 là float.
# int (số nguyên)
age = 25
print(type(age)) # <class 'int'>
# float (số thập phân)
weight = 175.5
print(type(weight)) # <class 'float'>
# Cùng "3" nhưng kiểu khác nhau tùy cách viết
print(type(3)) # <class 'int'>
print(type(3.0)) # <class 'float'>
# Số âm cũng vậy
print(type(-10)) # <class 'int'>
print(type(-10.5)) # <class 'float'>
Dạo qua các toán tử
Có 7 toán tử bạn dùng cho phép tính số. Bốn toán tử cơ bản + - * / hoạt động giống như ngôn ngữ khác, nhưng // (chia lấy nguyên), % (chia dư) và ** (lũy thừa) xuất hiện rất nhiều trong Python, nên đáng học kỹ.
| Toán tử | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
| + | Cộng | 10 + 3 | 13 |
| - | Trừ | 10 - 3 | 7 |
| * | Nhân | 10 * 3 | 30 |
| / | Chia (luôn float) | 10 / 3 | 3.3333... |
| // | Chia lấy nguyên (cắt phần thập phân) | 10 // 3 | 3 |
| % | Chia dư | 10 % 3 | 1 |
| ** | Lũy thừa | 2 ** 10 | 1024 |
/ trả về float kể cả giữa các int
10 / 2 là 5.0 (float), không phải 5.
/ của Python được thiết kế để luôn trả về float, nên kết quả là float ngay cả khi cả hai toán hạng là int.
Nếu bạn muốn kết quả là số nguyên, dùng //.
# Phép tính cơ bản
print(10 + 3) # 13
print(10 - 3) # 7
print(10 * 3) # 30
# Chia luôn trả về float
print(10 / 3) # 3.3333333333333335
print(10 / 2) # 5.0 (vẫn là float dù chia hết)
# Chia lấy nguyên (cắt) và chia dư
print(10 // 3) # 3
print(10 % 3) # 1
# Lũy thừa: a ** b nghĩa là "a mũ b"
print(2 ** 10) # 1024
print(3 ** 2) # 9
print(2 ** 0.5) # 1.4142135623730951 (dùng như căn bậc hai)
Toán tử gán gộp (+= / -= v.v.)
Mẫu kiểu "x = x + 1" — nơi bạn làm gì đó với một biến rồi ghi kết quả trở lại vào chính nó — xuất hiện suốt.
Bạn có thể rút gọn thành "x += 1", và các dạng rút gọn này gọi là toán tử gán gộp.
Mỗi toán tử `+ - / // % * đều có dạng gộp.
Dạng ngắn là cách viết một dòng cho ý "làm gì đó với chính mình rồi ghi lại".
Bên trong, nó hoạt động đúng như dạng mở rộng bên phải.
Ví dụ, đây là gì mỗi toán tử làm khi x = 10.
score = 10
score += 5 # 10 + 5 -> 15
print(score) # 15
score *= 2 # 15 * 2 -> 30
print(score) # 30
score -= 7 # 30 - 7 -> 23
print(score) # 23
# Cũng hoạt động với float
weight = 60.0
weight += 1.5
print(weight) # 61.5
Trộn int và float trong phép toán
Khi bạn trộn int và float, kết quả luôn là float. Đó là vì Python tự động nâng lên kiểu có độ chính xác cao hơn.
Như đã nói ở trên, / (chia) trả về float ngay cả giữa các int, còn // (chia lấy nguyên) trả về int khi cả hai toán hạng là int.
int + int = int.
Nhưng / luôn trả về float.
Nếu có vế nào là float, kết quả là float.
# int với int vẫn là int
print(10 + 3) # 13 -> int
print(type(10 + 3)) # <class 'int'>
# Nếu vế nào đó là float, kết quả là float
print(10 + 3.0) # 13.0
print(type(10 + 3.0)) # <class 'float'>
# / trả về float ngay cả giữa các int
print(10 / 2) # 5.0
print(type(10 / 2)) # <class 'float'>
# // vẫn là int khi cả hai là int
print(10 // 3) # 3
print(type(10 // 3)) # <class 'int'>
# // thành float nếu có vế nào là float
print(10 // 3.0) # 3.0
print(type(10 // 3.0)) # <class 'float'>
float có độ chính xác giới hạn
Máy tính lưu float dưới dạng xấp xỉ nhị phân. Vì vậy ngay cả các phép tính trông đơn giản cũng có thể cho sai số nhỏ.
Ví dụ dưới đây là một "cái bẫy float" kinh điển — mọi người mới bắt đầu đều vấp phải vào lúc nào đó.
Dùng Decimal khi cần toán chính xác
Trong các tình huống mà ngay cả sai số nhỏ cũng không chấp nhận được — như tính tiền — bạn có thể làm toán thập phân chính xác bằng kiểu Decimal trong thư viện chuẩn. Ta sẽ không đề cập trong bài này, nhưng hãy nhớ: "float là xấp xỉ" và "có công cụ khác cho toán chính xác".
Đổi kiểu bằng int() và float()
Để chuyển giữa các kiểu số, dùng các hàm có sẵn int() và float().
Một điều cần để ý: int() cắt phần thập phân — nó không làm tròn. Nên truyền 3.9 vào int() được 3, không phải 4. Với giá trị âm, nó làm tròn về phía 0, nên -3.9 thành -3, không phải -4.
# float -> int là "cắt" (KHÔNG làm tròn!)
print(int(3.9)) # 3
print(int(3.1)) # 3
print(int(-3.9)) # -3 (làm tròn về phía 0)
# int -> float chỉ thêm .0
print(float(5)) # 5.0
print(float(-2)) # -2.0
# Dùng chuyển đổi qua biến
a = 3.9
a = int(a)
print(a, type(a)) # 3 <class 'int'>
b = 5
b = float(b)
print(b, type(b)) # 5.0 <class 'float'>
Trong bài này, bạn đã học:
- Khác biệt giữa int và float
- Lũy thừa với "**" và gán gộp (+= và đồng bọn)
- Khác biệt kiểu trả về giữa "/" (chia) và "//" (chia lấy nguyên)
- Vấn đề độ chính xác của float
- Chuyển kiểu bằng int() / float()
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Đoạn code này in gì?
x = 10
x **= 3
print(x)`
Câu 3Đoạn code này in gì?print(int(-3.9))