Đối với phép tính số thực dấu phẩy động thập phân, Python cung cấp module decimal. Module này có hàng trăm hàm giúp xử lý hiệu quả các phép tính thập phân. Chúng ta sẽ xem xét các hàm quan trọng và được sử dụng rộng rãi nhất về chủ đề này.
compare()
Hàm này so sánh các số thập phân. Trả về 1 nếu đối số Decimal thứ nhất lớn hơn thứ hai, -1 nếu nhỏ hơn, và 0 nếu cả hai bằng nhau.
Ví dụ
import decimal
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.61)
# so sánh decimals
print("The result is : ", val1.compare(val2))
# reset giá trị
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(-2.6)
print("The result is : ", val1.compare(val2))
# reset giá trị
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.6)
print("The result is : ", val1.compare(val2))
Kết quả
Chạy mã trên cho kết quả sau:
The result is : -1 The result is : 1 The result is : 0
max() và min()
Chúng tìm giá trị lớn nhất và nhỏ nhất của hai số thập phân tương ứng.
Ví dụ
import decimal
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.61)
print("The max value is : ", round(val1.max(val2), 2))
print("The min value is : ", round(val1.min(val2), 2))
Kết quả
Chạy mã trên cho kết quả sau:
The max value is : 2.61 The min value is : 2.60
getcontext()
Chúng ta có thể thay đổi độ chính xác của các phép toán bằng phương pháp này. Độ chính xác mặc định là 28. Trong ví dụ dưới đây, chúng ta thực hiện một phép toán số học cho thấy kết quả theo độ chính xác được đặt bởi getcontext().prec.
Ví dụ
from decimal import * print(Decimal(13) / Decimal(7)) getcontext().prec = 6 print(Decimal(13) / Decimal(7)) getcontext().prec = 10 print(Decimal(13) / Decimal(7))
Kết quả
Chạy mã trên cho kết quả sau:
1.857142857142857142857142857 1.85714 1.857142857
exp()
Trả về giá trị của hàm mũ tự nhiên e**x tại số cho trước.
Ví dụ
from decimal import * # Tìm e print(Decimal(1).exp()) # Tìm e mũ 2 print(Decimal(2).exp()) # Tìm e mũ 4 print(Decimal(4).exp())
Kết quả
Chạy mã trên cho kết quả sau:
2.718281828459045235360287471 7.389056098930650227230427461 54.59815003314423907811026120
as_integer_ratio()
Đôi khi chúng ta cần các số nguyên mà phép chia của chúng cho ra số thập phân chúng ta đang xử lý. Chúng ta có thể đạt được điều này bằng cách sử dụng as_integer_ratio().
Ví dụ
from decimal import *
v = Decimal('2.1834').as_integer_ratio()
print(v)
v = Decimal('-1.92').as_integer_ratio()
print(v)
Kết quả
Chạy mã trên cho kết quả sau:
(10917, 5000) (-48, 25)
ln() và log10()
Chúng ta có thể tính logarit tự nhiên (với cơ số e) cũng như logarit cơ số 10 bằng các hàm này. Chúng ta cung cấp giá trị thập phân cần tính logarit.
Ví dụ
from decimal import *
ln_val = Decimal('2.1').ln()
print(ln_val)
log_val = Decimal('2.1').log10()
print(log_val)
Kết quả
Chạy mã trên cho kết quả sau:
0.7419373447293773124826065257 0.3222192947339192680072441618
fma(a, b)
Đây là một hàm đặc biệt gọi là fused multiply and add (nhân cộng gộp). Số thập phân được cung cấp được nhân với đối số đầu tiên a và sau đó kết quả được cộng với đối số thứ hai b.
Ví dụ
from decimal import * # Tương đương (2.1*2)+5 fma_val = Decimal(2.1).fma(2, 5) print(fma_val) # Tương đương (8.1*3)+5 fma_val = Decimal(8.1).fma(3, 5) print(fma_val)
Kết quả
Chạy mã trên cho kết quả sau:
9.200000000000000177635683940 29.29999999999999893418589636