Trong Python, có một module gọi là Decimal, dùng để thực hiện các tác vụ liên quan đến số thập phân dấu chấm động. Module này cung cấp phép tính dấu chấm động được làm tròn chính xác.
Để sử dụng, trước tiên cần nhập module thư viện chuẩn Decimal:
import decimal
Phần dưới đây sẽ giới thiệu một số hàm quan trọng của module Decimal.
Hàm căn bậc hai sqrt() và hàm mũ exp()
Phương thức sqrt() dùng để tính căn bậc hai của một đối tượng Decimal cho trước. Phương thức exp() trả về giá trị ex cho x là số Decimal.
Mã ví dụ
# Thực hiện phương thức sqrt() và exp()
import decimal
my_dec = decimal.Decimal(25.36)
print(my_dec)
# Tìm căn bậc hai của số thập phân
print('Căn bậc hai là: ' + str(my_dec.sqrt()))
# Tìm e^x cho số thập phân
print('e^x là: ' + str(my_dec.exp()))
Kết quả
25.3599999999999994315658113919198513031005859375 Căn bậc hai là: 5.035871324805668565859161094 e^x là: 103206740212.7314661465187086
Các hàm logarit
Module Decimal có một số hàm logarit. Ở đây thảo luận hai trong số chúng. Phương thức ln() dùng để tìm logarit tự nhiên của số thập phân. Phương thức log10() dùng để tìm giá trị logarit với cơ số 10.
Mã ví dụ
# Thực hiện phương thức ln() và log10()
import decimal
my_dec = decimal.Decimal(25.36)
print(my_dec)
# Tìm giá trị logarit cơ số e
print('ln(x) là: ' + str(my_dec.ln()))
# Tìm giá trị logarit cơ số 10
print('log(x) là: ' + str(my_dec.log10()))
Kết quả
25.3599999999999994315658113919198513031005859375 ln(x) là: 3.233173129569025152000878282 log(x) là: 1.404149249209695070459909761
Phương thức as_tuple() và fma()
Phương thức as_tuple() dùng để biểu diễn số thập phân dưới dạng tuple với ba phần tử: dấu (sign), chữ số (digits) và giá trị số mũ (exponent). Trong trường dấu, nếu số là 0 nghĩa là số thập phân dương, nếu là 1 thì đại diện cho số âm.
Phương thức fma() là nhân cộng kết hợp (fused multiply-add). Nếu dùng fma(x, y) nó sẽ tính (số * x) + y. Trong trường hợp này phần (số*x) không bị làm tròn.
Mã ví dụ
# Thực hiện as_tuple() và fma()
import decimal
my_dec1 = decimal.Decimal(5.3)
print(my_dec1)
my_dec2 = decimal.Decimal(-9.23)
print(my_dec2)
# Hiển thị thập phân dưới dạng tuple
print('\nmy_dec1 as tuple: ' + str(my_dec1.as_tuple()))
print('\nmy_dec2 as tuple: ' + str(my_dec2.as_tuple()))
# Thực hiện Fused Multiply and Add
print('\n(x*5)+8 là: ' + str(my_dec1.fma(5, 8)))
Kết quả
5.29999999999999982236431605997495353221893310546875 -9.230000000000000426325641456060111522674560546875 my_dec1 as tuple: DecimalTuple(sign=0, digits=(5, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 2, 2, 3, 6, 4, 3, 1, 6, 0, 5, 9, 9, 7, 4, 9, 5, 3, 5, 3, 2, 2, 1, 8, 9, 3, 3, 1, 0, 5, 4, 6, 8, 7, 5), exponent=-50) my_dec2 as tuple: DecimalTuple(sign=1, digits=(9, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 6, 3, 2, 5, 6, 4, 1, 4, 5, 6, 0, 6, 0, 1, 1, 1, 5, 2, 2, 6, 7, 4, 5, 6, 0, 5, 4, 6, 8, 7, 5), exponent=-48) (x*5)+8 là: 34.49999999999999911182158030
Phương thức compare()
Phương thức compare() dùng để so sánh hai số thập phân. Khi hai số bằng nhau, trả về 0; khi số thứ nhất lớn hơn, trả về +1; khi số thứ nhất nhỏ hơn, trả về -1.
Mã ví dụ
# Thực hiện compare()
import decimal
# So sánh khi cả hai bằng nhau
print('Giá trị so sánh: ' + str(decimal.Decimal(-5.3).compare(decimal.Decimal(-5.3))))
# So sánh khi số thứ nhất nhỏ hơn
print('Giá trị so sánh: ' + str(decimal.Decimal(-5.3).compare(decimal.Decimal(9.26))))
# So sánh khi số thứ nhất lớn hơn
print('Giá trị so sánh: ' + str(decimal.Decimal(-5.3).compare(decimal.Decimal(-13.25))))
Kết quả
Giá trị so sánh: 0 Giá trị so sánh: -1 Giá trị so sánh: 1
Một số hàm sao chép
Có các phương thức khác nhau để sao chép số thập phân vào đối tượng Decimal khác. Phương thức đầu tiên là copy_abs() – lấy giá trị tuyệt đối. Phương thức thứ hai là copy_negate() – sao chép sau khi đảo dấu. Phương thức thứ ba là copy_sign() – in đối số đầu tiên, lấy dấu từ đối số thứ hai.
Mã ví dụ
# Thực hiện copy_abs(), copy_negate() và copy_sign()
import decimal
my_dec = decimal.Decimal(-25.36)
print(my_dec)
# Sao chép giá trị tuyệt đối
temp_dec = my_dec.copy_abs()
print('Tuyệt đối là: ' + str(temp_dec))
# Sao chép giá trị âm
my_dec = decimal.Decimal(7.26)
temp_dec = my_dec.copy_negate()
print('Đảo dấu của 7.26 là: ' + str(temp_dec))
# Sao chép dấu từ đối số thứ hai sang đối số đầu tiên
my_dec = decimal.Decimal(-25.36)
temp_dec = my_dec.copy_sign(decimal.Decimal(12.5))
print('Sao chép dấu từ đối số thứ hai: ' + str(temp_dec))
Kết quả
-25.3599999999999994315658113919198513031005859375 Tuyệt đối là: 25.3599999999999994315658113919198513031005859375 Đảo dấu của 7.26 là: -7.2599999999999997868371792719699442386627197265625 Sao chép dấu từ đối số thứ hai: 25.3599999999999994315658113919198513031005859375
Phương thức max và min
max và min là hai phương thức đơn giản dùng để tìm giá trị lớn nhất hoặc nhỏ nhất giữa hai số.
Mã ví dụ
# Thực hiện max() và min()
import decimal
my_dec1 = decimal.Decimal(5.3)
print(my_dec1)
my_dec2 = decimal.Decimal(-9.23)
print(my_dec2)
# Hiển thị Min và Max
print('Tối thiểu: ' + str(my_dec1.min(my_dec2)))
print('Tối đa: ' + str(my_dec2.max(my_dec1)))
Kết quả
5.29999999999999982236431605997495353221893310546875 -9.230000000000000426325641456060111522674560546875 Tối thiểu: -9.230000000000000426325641456 Tối đa: 5.299999999999999822364316060