Computer >> Máy Tính >  >> Lập trình >> Python

Dấu chấm cố định thập phân và số học dấu phẩy động trong Python

Số dấu phẩy động được biểu diễn trong bộ nhớ dưới dạng phân số nhị phân cơ số 2. Do đó, các phép toán số học dấu phẩy động đôi khi có thể kỳ lạ. Phép cộng 0,1 và 0,2 có thể cho kết quả khó chịu như sau -

>>> 0,1 + 0,20.30000000000000004 

Thực chất đây là bản chất của biểu diễn dấu phẩy động nhị phân. Điều này là phổ biến trong bất kỳ ngôn ngữ lập trình nào. Python cung cấp một mô-đun thập phân để thực hiện phép tính số học dấu phẩy động được làm tròn nhanh và chính xác.

Mô-đun thập phân được thiết kế để biểu diễn các dấu phẩy động chính xác như cách người ta muốn chúng hoạt động và kết quả hoạt động số học phù hợp với mong đợi. Mức độ chính xác của đại diện và hoạt động có thể được thiết lập đến 28 vị trí.

Mô-đun thập phân xác định lớp Thập phân. Đối tượng thập phân có thể được khai báo bằng cách cung cấp một số nguyên, một chuỗi có biểu diễn số hoặc một bộ giá trị dưới dạng tham số cho phương thức khởi tạo của nó

>>> từ nhập thập phân Thập phân>>> d1 =Decimal (10)>>> d1Decimal ('10 ')>>> d2 =Decimal ('10')>>> d2Decimal ('10 ')  

Một tham số bộ chứa ba phần tử, dấu (0 cho dương, 1 cho âm), một bộ chữ số và số mũ. Ví dụ

>>> d3 =Decimal ((1, (1, 2,3, 4), 2))>>> d3Decimal ('- 1.234E + 5') 

Một cách thuận tiện hơn để biểu diễn số dấu phẩy động của một độ chính xác cụ thể là lấy môi trường ngữ cảnh của luồng hiện tại bằng cách getcontext () finction và đặt độ chính xác cho đối tượng Decimal.

>>> từ nhập thập phân Thập phân, getcontext>>> getcontext (). Prec =5>>> d3 =Decimal (10)>>> d4 =Decimal (3)>>> d3 / d4Decimal ('3.3333' ) 

Bối cảnh là môi trường cho các phép toán số học được sử dụng để xác định độ chính xác và xác định các quy tắc làm tròn cũng như giới hạn phạm vi cho số mũ.

decimal.getcontext () - Trả lại ngữ cảnh hiện tại cho chuỗi hoạt động.

decimal.setcontext (c) - Đặt ngữ cảnh hiện tại cho chuỗi hoạt động thành c.

Các hằng số chế độ làm tròn sau đây được xác định trong mô-đun thập phân -

ROUND_CEILING Vòng về phía Vô cực.
ROUND_DOWN Làm tròn về 0.
ROUND_FLOOR Vòng về phía-Vô cực.
ROUND_HALF_DOWN Làm tròn đến gần nhất với các ràng buộc về 0.
ROUND_HALF_EVEN Làm tròn đến gần nhất với các mối ràng buộc đến số nguyên chẵn gần nhất.
ROUND_HALF_UP Làm tròn đến gần nhất với các ràng buộc đi từ 0.
ROUND_UP Làm tròn số 0.
ROUND_05UP Làm tròn từ 0 nếu chữ số cuối cùng sau khi làm tròn về 0 sẽ là 0 hoặc 5; nếu không thì làm tròn về 0.

Đoạn mã sau sử dụng các thông số chính xác và làm tròn của đối tượng ngữ cảnh

>>> từ nhập thập phân *>>> getcontext (). Prec =5>>> getcontext (). rounding =ROUND_UP>>> d1 =Decimal (100)>>> d2 =Decimal (6)>>> d1 / d2Decimal ('16 .667') 

Các phép toán số học trên các đối tượng Thập phân

Tất cả các phép toán số học thông thường đều được thực hiện trên các đối tượng Decimal, giống như các float thông thường.

>>> a =Decimal ('2.4')>>> b =Decimal ('1.2')>>> a + bDecimal ('3.6')>>> a - bDecimal ('1.2')>>> b - aDecimal ('- 1.2')>>> a * bDecimal ('2.88')>>> a / bDecimal ('2') 

Phép toán số học có thể được thực hiện trên một toán hạng thập phân và một toán hạng số nguyên. Tuy nhiên, với đối tượng dấu chấm động thông thường, các hoạt động của đối tượng không hợp lệ.

>>> a =Decimal ('2.4')>>> c =2.1>>> a + cTraceback (lệnh gọi gần đây nhất):Tệp "", dòng 1, trong  a + cTypeError:(các) loại toán hạng không được hỗ trợ cho +:'decimal.Decimal' và 'float' 

Cùng một ngoại lệ xảy ra cho tất cả các phép toán số học.

Hành vi của toán tử phần dư (%) với đối tượng Decimal hơi khác so với các kiểu số thông thường. Ở đây, dấu hiệu của kết quả là cổ tức chứ không phải là số chia

>>> -7% 32>>> 7% -3-2>>> Decimal (-7)% Decimal (3) Decimal ('- 1')>>> Decimal (7)% Decimal (- 3) Số thập phân ('1') 

Decimal.from_float () - Hàm này chuyển đổi float thông thường thành đối tượng Decimal với biểu diễn nhị phân chính xác. Kết quả là from_float (0,1) và Decimal ('0,1') không giống nhau.

>>> d1 =Decimal ('0.1')>>> d2 =Decimal.from_float (0.1)>>> d1, d2 (Decimal ('0.1'), Decimal ('0.10000000000000055511151231257827021181583404541015625')) 

Bài viết này giải thích cách sử dụng chức năng được xác định trong mô-đun thập phân của thư viện chuẩn Python.