【Làm tròn số và quản lý độ chính xác trong Python】Cách sử dụng hàm round() và mô-đun decimal

1. Cơ bản về hàm round() trong Python

Tổng quan về hàm round()

Hàm round() trong Python là một hàm cơ bản để làm tròn số. Nó chủ yếu được sử dụng để làm tròn số với số chữ số thập phân được chỉ định. Điều này giúp điều chỉnh kết quả tính toán và hiển thị dữ liệu một cách ngắn gọn hơn.

Cú pháp cơ bản

round(number[, ndigits])
  • number: Số cần làm tròn.
  • ndigits: Số chữ số sau dấu thập phân (tùy chọn). Nếu không được chỉ định, số sẽ được làm tròn thành số nguyên.

Ví dụ sử dụng

print(round(3.14159))    # Kết quả: 3
print(round(3.14159, 2)) # Kết quả: 3.14
print(round(1.5))        # Kết quả: 2

Như vậy, hàm round() có thể làm tròn theo số chữ số được chỉ định. Nếu ndigits không được cung cấp, số sẽ được làm tròn thành số nguyên.

2. Phương pháp làm tròn trong Python: “Làm tròn kiểu ngân hàng”

Làm tròn kiểu ngân hàng là gì?

Hàm round() trong Python sử dụng phương pháp làm tròn gọi là “Làm tròn kiểu ngân hàng” (Banker’s Rounding). Đây là cách làm tròn số khi phần thập phân là 0.5 theo hướng số chẵn gần nhất. Ví dụ, 2.5 sẽ được làm tròn thành 2, còn 3.5 sẽ được làm tròn thành 4. Phương pháp này thường được sử dụng trong thống kê và tài chính để tránh sai lệch dữ liệu.

Ví dụ về làm tròn kiểu ngân hàng

print(round(2.5))  # Kết quả: 2
print(round(3.5))  # Kết quả: 4

Như vậy, với phương pháp này, nếu phần thập phân là 0.5, số sẽ được làm tròn về số chẵn gần nhất để giảm sai số tích lũy.

Lợi ích của làm tròn kiểu ngân hàng

Phương pháp này giúp giảm sai số tích lũy do việc chỉ sử dụng phương pháp làm tròn lên hoặc làm tròn xuống. Đặc biệt, nó rất hữu ích khi xử lý một lượng lớn dữ liệu để giữ cân bằng số liệu.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. Vấn đề của số dấu phẩy động

Biểu diễn nội bộ và lỗi của số dấu phẩy động

Trong Python, số dấu phẩy động được biểu diễn bằng hệ nhị phân. Điều này dẫn đến việc một số số thập phân không thể được biểu diễn chính xác, có thể gây ra kết quả không mong muốn khi làm tròn. Đặc biệt, khi một số không thể được biểu diễn chính xác trong hệ thống nhị phân, kết quả của hàm round() có thể không như mong đợi.

Ví dụ về vấn đề của số dấu phẩy động

n = 3.15
print(round(n, 1))  # Kết quả: 3.1 (Dự đoán: 3.2)

Trong ví dụ này, 3.15 được biểu diễn nội bộ là 3.149999..., dẫn đến kết quả không như mong đợi. Đây là một hạn chế của số dấu phẩy động.

Nguyên nhân gây ra lỗi của số dấu phẩy động

Số dấu phẩy động được biểu diễn trong hệ nhị phân, nên một số giá trị như 1.15 hoặc 3.15 không thể được biểu diễn chính xác. Do đó, lỗi có thể xảy ra khi làm tròn. Để tránh vấn đề này, chúng ta có thể sử dụng mô-đun decimal cho các phép tính có độ chính xác cao hơn.

4. Mô-đun decimal để duy trì độ chính xác

Tổng quan về mô-đun decimal

Mô-đun decimal giúp tránh lỗi của số dấu phẩy động và thực hiện các phép toán có độ chính xác cao. Điều này đặc biệt hữu ích trong các phép tính tài chính hoặc khoa học, nơi yêu cầu kết quả chính xác.

Ví dụ sử dụng

from decimal import Decimal, ROUND_HALF_UP
n = Decimal('3.15')
print(n.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP))  # Kết quả: 3.2

Lớp Decimal giúp tránh lỗi của số dấu phẩy động và đảm bảo độ chính xác cao trong các phép tính. Tham số ROUND_HALF_UP hoạt động giống như phương pháp làm tròn thông thường.

Các chế độ làm tròn khác

Mô-đun decimal cung cấp nhiều chế độ làm tròn khác nhau, bao gồm:

  • ROUND_DOWN: Luôn luôn làm tròn xuống.
  • ROUND_CEILING: Làm tròn lên với số dương, làm tròn xuống với số âm.
  • ROUND_FLOOR: Luôn làm tròn xuống (bao gồm cả số âm).

Bằng cách sử dụng các chế độ này, chúng ta có thể kiểm soát cách làm tròn số tùy theo từng trường hợp cụ thể.

年収訴求

5. Các phương pháp làm tròn khác: math.floor()math.ceil()

math.floor(): Làm tròn xuống

Hàm math.floor() loại bỏ phần thập phân và làm tròn xuống số nguyên gần nhất. Đối với số âm, nó cũng làm tròn xuống giá trị nhỏ hơn.

import math
print(math.floor(3.9))  # Kết quả: 3

math.ceil(): Làm tròn lên

Ngược lại, hàm math.ceil() luôn làm tròn lên đến số nguyên gần nhất.

import math
print(math.ceil(3.1))   # Kết quả: 4

Sự khác biệt giữa round() và các phương pháp khác

Hàm round() làm tròn về số gần nhất, trong khi math.floor()math.ceil() làm tròn theo một hướng cố định. Khi làm việc với số âm hoặc cần kiểm soát chặt chẽ hơn việc làm tròn, các hàm này rất hữu ích.

6. Các ứng dụng thực tế

Ứng dụng trong tính toán tiền tệ

Trong tính toán tiền tệ, độ chính xác rất quan trọng. Sử dụng mô-đun decimal giúp đảm bảo các con số không bị sai lệch do lỗi dấu phẩy động.

from decimal import Decimal, ROUND_HALF_UP
price = Decimal('19.995')
print(price.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))  # Kết quả: 20.00

Ứng dụng trong tính toán khoa học

Trong các tính toán khoa học, lỗi dấu phẩy động có thể ảnh hưởng đáng kể đến độ chính xác của kết quả. Sử dụng decimal giúp duy trì độ chính xác cao.

Ứng dụng trong phân tích dữ liệu

Khi phân tích dữ liệu, việc làm tròn số hợp lý giúp tránh sai số tích lũy. Kết hợp sử dụng decimalround() sẽ mang lại kết quả chính xác hơn.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

7. Tổng kết

Hàm round() trong Python là một công cụ hữu ích để làm tròn số, nhưng có thể gặp vấn đề với lỗi dấu phẩy động. Trong các trường hợp yêu cầu độ chính xác cao như tài chính hoặc khoa học, nên sử dụng mô-đun decimal. Ngoài ra, các phương pháp làm tròn khác như math.floor()math.ceil() cũng có thể được sử dụng tùy theo nhu cầu.