Hướng dẫn convert float to decimal python - chuyển đổi float thành python thập phân

Tôi đã gặp phải vấn đề / câu hỏi tương tự ngày hôm nay và tôi không hoàn toàn hài lòng với bất kỳ câu trả lời nào được đưa ra cho đến nay. Cốt lõi của câu hỏi dường như là:

Ai đó có thể đề xuất một cách tốt để chuyển đổi từ phao sang thập phân [...] có lẽ hạn chế số lượng các chữ số quan trọng có thể được hỗ trợ?

Câu trả lời ngắn / giải pháp: Có.

def ftod(val, prec = 15):
    return Decimal(val).quantize(Decimal(10)**-prec)

Câu trả lời dài:

Như Nosklo đã chỉ ra, không thể bảo toàn đầu vào của người dùng sau khi nó được chuyển đổi thành float. Mặc dù có thể làm tròn giá trị đó với độ chính xác hợp lý và chuyển đổi nó thành thập phân.

Trong trường hợp của tôi, tôi chỉ cần 2 đến 4 chữ số sau khi phân tách, nhưng chúng cần phải chính xác. Hãy xem xét kiểm tra Cổ điển 0,1 + 0,2 == 0,3.

>>> 0.1 + 0.2 == 0.3
False

Bây giờ chúng ta hãy làm điều này với chuyển đổi sang thập phân (ví dụ hoàn chỉnh):

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True

Câu trả lời của Ryabchenko Alexander thực sự hữu ích cho tôi. Nó chỉ thiếu một cách để tự động thiết lập độ chính xác - một tính năng tôi muốn (và cũng có thể cần). Câu hỏi thường gặp về tài liệu thập phân đưa ra một ví dụ về cách xây dựng chuỗi đối số cần thiết cho Quantize ():

>>> Decimal(10)**-4
Decimal('0.0001')

Đây là cách các số trông giống như được in với 18 chữ số sau khi phân tách (đến từ lập trình C Tôi thích các biểu thức python ưa thích):

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000

Và cuối cùng tôi muốn biết độ chính xác nào mà so sánh vẫn hoạt động:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False

15 dường như là một mặc định tốt cho độ chính xác tối đa. Điều đó sẽ hoạt động trên hầu hết các hệ thống. Nếu bạn cần thêm thông tin, hãy thử:

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

Với Float có 53 bit Mantissa trên hệ thống của tôi, tôi đã tính toán số chữ số thập phân:

>>> import math
>>> math.log10(2**53)
15.954589770191003

Điều đó cho tôi biết với 53 bit chúng tôi nhận được gần 16 chữ số. Vì vậy, 15 IST tốt cho giá trị chính xác và luôn luôn hoạt động. 16 là dễ bị lỗi và 17 chắc chắn gây ra rắc rối (như đã thấy ở trên).almost 16 digits. So 15 ist fine for the precision value and should always work. 16 is error-prone and 17 definitly causes trouble (as seen above).

Dù sao ... trong trường hợp cụ thể của tôi, tôi chỉ cần 2 đến 4 chữ số, nhưng là người cầu toàn, tôi rất thích điều tra điều này :-)

Bất kỳ đề xuất / cải tiến / khiếu nại đều được hoan nghênh.

Mã nguồn: lib/decimal.py Lib/decimal.py


Mô -đun

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
1 cung cấp hỗ trợ cho số học điểm nổi tròn chính xác chính xác. Nó cung cấp một số lợi thế so với kiểu dữ liệu
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2:

  • Decimal, dựa trên mô hình dấu phẩy động được thiết kế với mọi người và nhất thiết phải có một nguyên tắc hướng dẫn tối quan trọng-máy tính phải cung cấp một số học hoạt động theo cách tương tự như số học mà mọi người học ở trường. - Đoạn trích từ đặc điểm số học thập phân.

  • Số thập phân có thể được đại diện chính xác. Ngược lại, các số như

    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    3 và
    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    4 không có biểu diễn chính xác trong điểm nổi nhị phân. Người dùng cuối thường không mong đợi
    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    5 sẽ hiển thị là
    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    6 như với điểm nổi nhị phân.

  • Sự chính xác mang lại vào số học. Trong điểm nổi thập phân,

    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    7 chính xác bằng không. Trong điểm nổi nhị phân, kết quả là
    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    8. Mặc dù gần bằng không, sự khác biệt ngăn chặn kiểm tra và khác biệt đáng tin cậy có thể tích lũy. Vì lý do này, thập phân được ưa thích trong các ứng dụng kế toán có bất biến bình đẳng nghiêm ngặt.

  • Mô -đun thập phân kết hợp một khái niệm về các địa điểm quan trọng để

    >>> import sys
    >>> sys.float_info
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
    9 là
    >>> import math
    >>> math.log10(2**53)
    15.954589770191003
    
    0. Số 0 được giữ để chỉ ra ý nghĩa. Đây là bản trình bày thông thường cho các ứng dụng tiền tệ. Để nhân lên, phương pháp tiếp cận của trường học của người Viking sử dụng tất cả các số liệu trong nhân vật nhân. Chẳng hạn,
    >>> import math
    >>> math.log10(2**53)
    15.954589770191003
    
    1 cho
    >>> import math
    >>> math.log10(2**53)
    15.954589770191003
    
    2 trong khi
    >>> import math
    >>> math.log10(2**53)
    15.954589770191003
    
    3 cho
    >>> import math
    >>> math.log10(2**53)
    15.954589770191003
    
    4.

  • Không giống như điểm nổi nhị phân dựa trên phần cứng, mô -đun thập phân có độ chính xác có thể thay đổi của người dùng (mặc định đến 28 vị trí) có thể lớn như cần thiết cho một vấn đề nhất định:

    >>> from decimal import *
    >>> getcontext().prec = 6
    >>> Decimal(1) / Decimal(7)
    Decimal('0.142857')
    >>> getcontext().prec = 28
    >>> Decimal(1) / Decimal(7)
    Decimal('0.1428571428571428571428571429')
    

  • Cả điểm nổi nhị phân và thập phân được thực hiện theo các tiêu chuẩn được công bố. Mặc dù loại phao tích hợp chỉ hiển thị một phần khiêm tốn của khả năng của nó, mô-đun thập phân cho thấy tất cả các phần cần thiết của tiêu chuẩn. Khi cần thiết, lập trình viên có toàn quyền kiểm soát làm tròn và xử lý tín hiệu. Điều này bao gồm một tùy chọn để thực thi số học chính xác bằng cách sử dụng các ngoại lệ để chặn mọi hoạt động không chính xác.

  • Mô-đun thập phân được thiết kế để hỗ trợ mà không có thành kiến, cả số học thập phân không có căn cứ chính xác (đôi khi được gọi là số học điểm cố định) và số học nổi tròn. - Đoạn trích từ đặc điểm số học thập phân.

Thiết kế mô -đun tập trung vào ba khái niệm: số thập phân, bối cảnh cho số học và tín hiệu.

Một số thập phân là bất biến. Nó có một dấu hiệu, số số hệ số và số mũ. Để giữ được ý nghĩa, các số số hệ số không cắt giảm các số không kéo dài. Số thập phân cũng bao gồm các giá trị đặc biệt như

>>> import math
>>> math.log10(2**53)
15.954589770191003
5,
>>> import math
>>> math.log10(2**53)
15.954589770191003
6 và
>>> import math
>>> math.log10(2**53)
15.954589770191003
7. Tiêu chuẩn cũng khác biệt
>>> import math
>>> math.log10(2**53)
15.954589770191003
8 với
>>> import math
>>> math.log10(2**53)
15.954589770191003
9.

Bối cảnh cho số học là một môi trường chỉ định độ chính xác, các quy tắc làm tròn, giới hạn đối với số mũ, cờ cho thấy kết quả hoạt động và các yếu tố hỗ trợ bẫy xác định xem các tín hiệu có được coi là ngoại lệ hay không. Các tùy chọn làm tròn bao gồm

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
0,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
1,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
2,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
3,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
4,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
5,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
6 và
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
7.

Tín hiệu là các nhóm điều kiện đặc biệt phát sinh trong quá trình tính toán. Tùy thuộc vào nhu cầu của ứng dụng, tín hiệu có thể bị bỏ qua, được coi là thông tin hoặc được coi là ngoại lệ. Các tín hiệu trong mô -đun thập phân là:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
8,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
2,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
3,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
4,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
5 và
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6.

Đối với mỗi tín hiệu có một cờ và một bộ tạo bẫy. Khi một tín hiệu gặp phải, cờ của nó được đặt thành một, sau đó, nếu bộ kích hoạt bẫy được đặt thành một, một ngoại lệ được nâng lên. Cờ bị dính, vì vậy người dùng cần đặt lại chúng trước khi theo dõi tính toán.

Xem thêm

  • Đặc điểm số học số thập phân tổng quát của IBM, đặc điểm số học số thập phân chung.

Hướng dẫn bắt đầu nhanh

Việc bắt đầu sử dụng số thập phân thông thường là nhập mô -đun, xem bối cảnh hiện tại với

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7 và, nếu cần, đặt các giá trị mới cho độ chính xác, làm tròn hoặc bẫy được bật:

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision

Các trường hợp thập phân có thể được xây dựng từ số nguyên, dây, phao hoặc bộ dữ liệu. Xây dựng từ một số nguyên hoặc phao thực hiện chuyển đổi chính xác giá trị của số nguyên hoặc phao. Các số thập phân bao gồm các giá trị đặc biệt như

>>> import math
>>> math.log10(2**53)
15.954589770191003
7 là viết tắt của không phải là một số, dương và âm
>>> import math
>>> math.log10(2**53)
15.954589770191003
5 và
>>> import math
>>> math.log10(2**53)
15.954589770191003
8:

>>> 0.1 + 0.2 == 0.3
False
0

Nếu tín hiệu

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6 bị mắc kẹt, sự pha trộn tình cờ của số thập phân và phao trong các hàm tạo hoặc so sánh đặt hàng sẽ gây ra một ngoại lệ:

>>> 0.1 + 0.2 == 0.3
False
1

Mới trong phiên bản 3.3.

Tầm quan trọng của một số thập phân mới được xác định chỉ bằng số lượng đầu vào. Độ chính xác bối cảnh và làm tròn chỉ phát huy tác dụng trong các hoạt động số học.

>>> 0.1 + 0.2 == 0.3
False
2

Nếu vượt quá giới hạn nội bộ của phiên bản C, việc xây dựng số thập phân tăng

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9:

>>> 0.1 + 0.2 == 0.3
False
3

Đã thay đổi trong phiên bản 3.3.

Số thập phân tương tác tốt với phần lớn phần còn lại của Python. Dưới đây là một rạp xiếc bay thả nổi số thập phân nhỏ:

>>> 0.1 + 0.2 == 0.3
False
4

Và một số chức năng toán học cũng có sẵn cho số thập phân:

>>> 0.1 + 0.2 == 0.3
False
5

Phương pháp

>>> 0.1 + 0.2 == 0.3
False
03 làm tròn một số vào số mũ cố định. Phương pháp này rất hữu ích cho các ứng dụng tiền tệ thường làm tròn kết quả đến một số địa điểm cố định:

>>> 0.1 + 0.2 == 0.3
False
6

Như được hiển thị ở trên, hàm

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7 truy cập vào bối cảnh hiện tại và cho phép các cài đặt được thay đổi. Cách tiếp cận này đáp ứng nhu cầu của hầu hết các ứng dụng.

Đối với công việc nâng cao hơn, có thể hữu ích để tạo bối cảnh thay thế bằng cách sử dụng hàm tạo ngữ cảnh (). Để thực hiện hoạt động thay thế, hãy sử dụng hàm

>>> 0.1 + 0.2 == 0.3
False
05.

Theo tiêu chuẩn, mô -đun

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
1 cung cấp hai bối cảnh tiêu chuẩn sẵn sàng sử dụng,
>>> 0.1 + 0.2 == 0.3
False
07 và
>>> 0.1 + 0.2 == 0.3
False
08. Cái trước đặc biệt hữu ích cho việc gỡ lỗi vì nhiều bẫy được bật:

>>> 0.1 + 0.2 == 0.3
False
7

Bối cảnh cũng có cờ tín hiệu để theo dõi các điều kiện đặc biệt gặp phải trong quá trình tính toán. Các cờ vẫn được đặt cho đến khi được xóa rõ ràng, vì vậy tốt nhất là xóa các cờ trước mỗi bộ tính toán được giám sát bằng cách sử dụng phương thức

>>> 0.1 + 0.2 == 0.3
False
09.

>>> 0.1 + 0.2 == 0.3
False
8

Mục nhập cờ cho thấy mức độ gần đúng hợp lý với

>>> 0.1 + 0.2 == 0.3
False
10 được làm tròn (các chữ số vượt quá độ chính xác ngữ cảnh đã bị vứt đi) và kết quả là không chính xác (một số chữ số bị loại bỏ là không khác).

Các bẫy riêng lẻ được đặt bằng cách sử dụng từ điển trong trường

>>> 0.1 + 0.2 == 0.3
False
11 của bối cảnh:

>>> 0.1 + 0.2 == 0.3
False
9

Hầu hết các chương trình điều chỉnh bối cảnh hiện tại chỉ một lần, khi bắt đầu chương trình. Và, trong nhiều ứng dụng, dữ liệu được chuyển đổi thành

>>> 0.1 + 0.2 == 0.3
False
12 với một diễn viên duy nhất bên trong một vòng lặp. Với bối cảnh được đặt và số thập phân được tạo ra, phần lớn chương trình thao túng dữ liệu không khác gì với các loại số Python khác.

Đối tượng thập phân

Lớp ________ 113 ________ 114 (value = '0', bối cảnh = none) ¶(value='0', context=None)

Xây dựng một đối tượng

>>> 0.1 + 0.2 == 0.3
False
12 mới dựa trên giá trị.

Giá trị có thể là một số nguyên, chuỗi, tuple,

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 hoặc đối tượng
>>> 0.1 + 0.2 == 0.3
False
12 khác. Nếu không có giá trị nào được đưa ra, trả về
>>> 0.1 + 0.2 == 0.3
False
18. Nếu giá trị là một chuỗi, nó sẽ phù hợp với cú pháp chuỗi số thập phân sau khi dẫn đầu và theo dõi các ký tự khoảng trắng, cũng như các dấu gạch dưới trong suốt, được loại bỏ:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
0

Các chữ số thập phân Unicode khác cũng được cho phép trong đó

>>> 0.1 + 0.2 == 0.3
False
19 xuất hiện ở trên. Chúng bao gồm các chữ số thập phân từ các bảng chữ cái khác nhau khác nhau (ví dụ, các chữ số tiếng Ả Rập và Devanāgarī) cùng với các chữ số fullwidth
>>> 0.1 + 0.2 == 0.3
False
20 đến
>>> 0.1 + 0.2 == 0.3
False
21.

Nếu giá trị là

>>> 0.1 + 0.2 == 0.3
False
22, nó sẽ có ba thành phần, một dấu hiệu (
>>> 0.1 + 0.2 == 0.3
False
23 cho dương hoặc
>>> 0.1 + 0.2 == 0.3
False
24 cho âm),
>>> 0.1 + 0.2 == 0.3
False
22 của các chữ số và số mũ số nguyên. Ví dụ:
>>> 0.1 + 0.2 == 0.3
False
26 trả về
>>> 0.1 + 0.2 == 0.3
False
27.

Nếu giá trị là

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2, giá trị điểm nổi nhị phân sẽ được chuyển đổi một cách không tổn thất thành tương đương thập phân chính xác của nó. Chuyển đổi này thường có thể yêu cầu 53 chữ số trở lên chính xác. Ví dụ,
>>> 0.1 + 0.2 == 0.3
False
29 chuyển đổi thành
>>> 0.1 + 0.2 == 0.3
False
30.

Độ chính xác bối cảnh không ảnh hưởng đến số lượng được lưu trữ. Điều đó được xác định riêng bởi số chữ số trong giá trị. Ví dụ,

>>> 0.1 + 0.2 == 0.3
False
31 ghi lại tất cả năm số không ngay cả khi độ chính xác ngữ cảnh chỉ là ba.

Mục đích của đối số ngữ cảnh là xác định phải làm gì nếu giá trị là một chuỗi không định dạng. Nếu bối cảnh bẫy

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9, một ngoại lệ sẽ được nâng lên; Mặt khác, hàm tạo trả về một số thập phân mới với giá trị
>>> import math
>>> math.log10(2**53)
15.954589770191003
7.

Sau khi được xây dựng, các đối tượng

>>> 0.1 + 0.2 == 0.3
False
12 là bất biến.

Thay đổi trong phiên bản 3.2: Đối số cho hàm tạo hiện được phép là một ví dụ

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2.The argument to the constructor is now permitted to be a
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 instance.

Đã thay đổi trong phiên bản 3.3:

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 Các đối số tăng một ngoại lệ nếu bẫy
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6 được đặt. Theo mặc định, bẫy bị tắt.
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 arguments raise an exception if the
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6 trap is set. By default the trap is off.

Đã thay đổi trong phiên bản 3.6: Dấu gạch dưới được phép nhóm, như với các chữ ký tích hợp và dấu phẩy động trong mã.Underscores are allowed for grouping, as with integral and floating-point literals in code.

Các đối tượng điểm nổi thập phân chia sẻ nhiều thuộc tính với các loại số tích hợp khác như

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 và
>>> 0.1 + 0.2 == 0.3
False
39. Tất cả các hoạt động toán học thông thường và các phương pháp đặc biệt được áp dụng. Tương tự như vậy, các đối tượng thập phân có thể được sao chép, ngâm, in, được sử dụng làm khóa từ điển, được sử dụng làm các yếu tố đã đặt, so sánh, sắp xếp và ép buộc sang loại khác (chẳng hạn như
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 hoặc
>>> 0.1 + 0.2 == 0.3
False
39).

Có một số khác biệt nhỏ giữa số học trên các đối tượng thập phân và số học trên số nguyên và phao. Khi toán tử còn lại

>>> 0.1 + 0.2 == 0.3
False
42 được áp dụng cho các đối tượng thập phân, dấu hiệu của kết quả là dấu hiệu của cổ tức chứ không phải là dấu hiệu của ước số:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
1

Toán tử phân chia số nguyên

>>> 0.1 + 0.2 == 0.3
False
43 hoạt động tương tự, trả về phần số nguyên của thương số thực (cắt ngắn về 0) thay vì sàn của nó, để bảo tồn danh tính thông thường
>>> 0.1 + 0.2 == 0.3
False
44:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
2

Các toán tử

>>> 0.1 + 0.2 == 0.3
False
42 và
>>> 0.1 + 0.2 == 0.3
False
43 thực hiện các hoạt động
>>> 0.1 + 0.2 == 0.3
False
47 và
>>> 0.1 + 0.2 == 0.3
False
48 (tương ứng) như được mô tả trong đặc điểm kỹ thuật.

Các đối tượng thập phân thường không thể được kết hợp với các phao hoặc các trường hợp

>>> 0.1 + 0.2 == 0.3
False
49 trong các hoạt động số học: ví dụ, một nỗ lực để thêm
>>> 0.1 + 0.2 == 0.3
False
12 vào
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2, chẳng hạn, sẽ tăng
>>> 0.1 + 0.2 == 0.3
False
52. Tuy nhiên, có thể sử dụng các toán tử so sánh Python, để so sánh một ví dụ
>>> 0.1 + 0.2 == 0.3
False
12
>>> 0.1 + 0.2 == 0.3
False
54 với một số khác
>>> 0.1 + 0.2 == 0.3
False
55. Điều này tránh kết quả khó hiểu khi thực hiện so sánh bình đẳng giữa các số loại khác nhau.

Thay đổi trong phiên bản 3.2: So sánh loại hỗn hợp giữa các trường hợp

>>> 0.1 + 0.2 == 0.3
False
12 và các loại số khác hiện được hỗ trợ đầy đủ.Mixed-type comparisons between
>>> 0.1 + 0.2 == 0.3
False
12 instances and other numeric types are now fully supported.

Ngoài các thuộc tính số tiêu chuẩn, các đối tượng điểm nổi thập phân cũng có một số phương pháp chuyên dụng:

________ 157 ()()

Trả về số mũ được điều chỉnh sau khi chuyển ra hệ số các chữ số bên phải của hệ số cho đến khi chỉ còn lại chữ số chì:

>>> 0.1 + 0.2 == 0.3
False
58 trả về bảy. Được sử dụng để xác định vị trí của chữ số quan trọng nhất đối với điểm thập phân.

________ 159 ()()

Trả về một cặp

>>> 0.1 + 0.2 == 0.3
False
60 số nguyên đại diện cho trường hợp
>>> 0.1 + 0.2 == 0.3
False
12 đã cho là một phần, theo mức thấp nhất và với mẫu số tích cực:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
3

Việc chuyển đổi là chính xác. Nâng cao Overflowerror về Infinities và ValueError trên Nans.

Mới trong phiên bản 3.6.

________ 162 ()()

Trả về một đại diện tuple có tên của số:

>>> 0.1 + 0.2 == 0.3
False
63.named tuple representation of the number:
>>> 0.1 + 0.2 == 0.3
False
63.

________ 164 ()()

Trả về mã hóa kinh điển của đối số. Hiện tại, việc mã hóa một ví dụ

>>> 0.1 + 0.2 == 0.3
False
12 luôn luôn là kinh điển, vì vậy hoạt động này trả về đối số của nó không thay đổi.

________ 166 (Khác, bối cảnh = Không) ¶(other, context=None)

So sánh các giá trị của hai trường hợp thập phân.

>>> 0.1 + 0.2 == 0.3
False
67 trả về một ví dụ thập phân và nếu một trong hai toán hạng là NAN thì kết quả là NAN:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
4

________ 168 (Khác, bối cảnh = Không) ¶(other, context=None)

Hoạt động này giống hệt với phương pháp

>>> 0.1 + 0.2 == 0.3
False
67, ngoại trừ tất cả tín hiệu NANS. Đó là, nếu cả hai toán hạng không phải là một NAN báo hiệu thì bất kỳ toán hạng NAN yên tĩnh nào cũng được đối xử như thể đó là một NAN báo hiệu.

________ 170 (Khác, bối cảnh = Không) ¶(other, context=None)

So sánh hai toán hạng bằng cách sử dụng biểu diễn trừu tượng của chúng thay vì giá trị số của chúng. Tương tự như phương pháp

>>> 0.1 + 0.2 == 0.3
False
67, nhưng kết quả đưa ra tổng số đặt hàng trên các trường hợp
>>> 0.1 + 0.2 == 0.3
False
12. Hai trường hợp
>>> 0.1 + 0.2 == 0.3
False
12 có cùng giá trị số nhưng các biểu diễn khác nhau so sánh không đồng đều trong thứ tự này:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
5

Nans yên tĩnh và báo hiệu cũng được bao gồm trong tổng số đơn đặt hàng. Kết quả của chức năng này là

>>> 0.1 + 0.2 == 0.3
False
18 nếu cả hai toán hạng có cùng một biểu diễn,
>>> 0.1 + 0.2 == 0.3
False
75 nếu toán hạng đầu tiên thấp hơn trong tổng thứ tự so với thứ hai và
>>> 0.1 + 0.2 == 0.3
False
76 nếu toán hạng đầu tiên cao hơn trong tổng số thứ tự so với toán hạng thứ hai. Xem thông số kỹ thuật để biết chi tiết về tổng số đơn đặt hàng.

Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có làm tròn nào được thực hiện. Như một ngoại lệ, phiên bản C có thể tăng không hợp lệ nếu toán hạng thứ hai không thể được chuyển đổi chính xác.

________ 177 (Khác, bối cảnh = Không) ¶(other, context=None)

So sánh hai toán hạng bằng cách sử dụng biểu diễn trừu tượng của chúng thay vì giá trị của chúng như trong

>>> 0.1 + 0.2 == 0.3
False
78, nhưng bỏ qua dấu hiệu của mỗi toán hạng.
>>> 0.1 + 0.2 == 0.3
False
79 tương đương với
>>> 0.1 + 0.2 == 0.3
False
80.

Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có làm tròn nào được thực hiện. Như một ngoại lệ, phiên bản C có thể tăng không hợp lệ nếu toán hạng thứ hai không thể được chuyển đổi chính xác.

________ 177 (Khác, bối cảnh = Không) ¶()

So sánh hai toán hạng bằng cách sử dụng biểu diễn trừu tượng của chúng thay vì giá trị của chúng như trong

>>> 0.1 + 0.2 == 0.3
False
78, nhưng bỏ qua dấu hiệu của mỗi toán hạng.
>>> 0.1 + 0.2 == 0.3
False
79 tương đương với
>>> 0.1 + 0.2 == 0.3
False
80.

________ 181 ()()

Chỉ cần trả lại bản thân, phương pháp này chỉ tuân thủ đặc tả số thập phân.

________ 182 ()()

Trả về giá trị tuyệt đối của đối số. Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có cách làm tròn nào được thực hiện.

________ 183 ()(other, context=None)

Trả lại sự phủ định của đối số. Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có cách làm tròn nào được thực hiện.

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
6

Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có làm tròn nào được thực hiện. Như một ngoại lệ, phiên bản C có thể tăng không hợp lệ nếu toán hạng thứ hai không thể được chuyển đổi chính xác.

________ 184 (Khác, bối cảnh = Không) ¶(context=None)

Trả về một bản sao của toán hạng đầu tiên với dấu hiệu được đặt giống như dấu hiệu của toán hạng thứ hai. Ví dụ:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
7

________ 185 (bối cảnh = không) ¶(f)

Trả về giá trị của hàm số mũ (tự nhiên)

>>> 0.1 + 0.2 == 0.3
False
86 ở số đã cho. Kết quả được làm tròn chính xác bằng chế độ làm tròn
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
4.

ClassMethod ________ 188 (f)

Hàm tạo thay thế chỉ chấp nhận các trường hợp

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2 hoặc
>>> 0.1 + 0.2 == 0.3
False
39.

Lưu ý

>>> 0.1 + 0.2 == 0.3
False
91 không giống như
>>> 0.1 + 0.2 == 0.3
False
92. Vì 0,1 không thể đại diện chính xác trong điểm nổi nhị phân, giá trị được lưu trữ dưới dạng giá trị đại diện gần nhất là
>>> 0.1 + 0.2 == 0.3
False
93. Giá trị tương đương đó trong thập phân là
>>> 0.1 + 0.2 == 0.3
False
94.

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
8

Ghi chú

Từ Python 3.2 trở đi, một ví dụ
>>> 0.1 + 0.2 == 0.3
False
12 cũng có thể được xây dựng trực tiếp từ
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2.(other, third, context=None)

Mới trong phiên bản 3.1.

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
9

________ 197 (Khác, thứ ba, bối cảnh = Không) ¶()

Nội dung nhân lên. Tự trả lại*Khác+thứ ba không có sự làm tròn của sản phẩm trung gian tự*khác.

________ 198 ()()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là chính tắc và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác. Hiện tại, một ví dụ
>>> 0.1 + 0.2 == 0.3
False
12 luôn luôn có kinh điển, vì vậy hoạt động này luôn trả về
>>> 0.1 + 0.2 == 0.3
False
99.

________ 203 ()()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là một số hữu hạn và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 nếu đối số là vô cực hoặc NAN.

________ 206 ()()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là vô cùng dương hoặc âm và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác.

________ 209 ()(context=None)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là một NAN (yên tĩnh hoặc tín hiệu) và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác.

________ 212 (bối cảnh = không) ¶()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là số hữu hạn bình thường. Trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 nếu đối số bằng không, không bình thường, vô hạn hoặc NAN.

________ 215 ()()

Trả lại

>>> 0.1 + 0.2 == 0.3
False
99 Nếu cuộc tranh luận là một NAN yên tĩnh và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác.

________ 218 ()()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số có dấu âm và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác. Lưu ý rằng cả Zeros và Nans đều có thể mang dấu hiệu.

________ 221 ()(context=None)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là NAN và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 báo hiệu.

________ 224 (bối cảnh = không) ¶()

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là không bình thường và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác.

________ 227 ()(context=None)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu đối số là (dương hoặc âm) bằng không và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 khác.

________ 230 (bối cảnh = không) ¶(context=None)

Trả về logarit tự nhiên (cơ sở E) của toán hạng. Kết quả được làm tròn chính xác bằng chế độ làm tròn

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
4.

________ 232 (bối cảnh = không) ¶(context=None)

Trả lại cơ sở mười logarit của toán hạng. Kết quả được làm tròn chính xác bằng chế độ làm tròn

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
4.

________ 234 (bối cảnh = không) ¶(other, context=None)

Đối với một số khác nhau, hãy trả về số mũ được điều chỉnh của toán hạng của nó dưới dạng ví dụ

>>> 0.1 + 0.2 == 0.3
False
12. Nếu toán hạng bằng 0 thì
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
36 sẽ được trả về và cờ
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0 được nâng lên. Nếu toán hạng là vô cực thì
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
38 sẽ được trả về.Logical operands). The result is the digit-wise
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
41 of the two operands.

________ 242 (bối cảnh = không) ¶(context=None)

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
43 là một hoạt động hợp lý. Kết quả là đảo ngược chữ số của toán hạng.

________ 244 (Khác, bối cảnh = Không) ¶(other, context=None)

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
45 là một hoạt động logic có hai toán hạng logic (xem các toán hạng logic). Kết quả là chữ số
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
46 của hai toán hạng.Logical operands). The result is the digit-wise
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
46 of the two operands.

________ 247 (Khác, bối cảnh = Không) ¶(other, context=None)

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
48 là một hoạt động logic có hai toán hạng logic (xem các toán hạng logic). Kết quả là độc quyền chữ số hoặc của hai toán hạng.Logical operands). The result is the digit-wise exclusive or of the two operands.

________ 249 (Khác, bối cảnh = Không) ¶(other, context=None)

Giống như

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
50 ngoại trừ quy tắc làm tròn ngữ cảnh được áp dụng trước khi trả về và các giá trị
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 được báo hiệu hoặc bỏ qua (tùy thuộc vào ngữ cảnh và liệu chúng có báo hiệu hay yên tĩnh).

________ 252 (Khác, bối cảnh = Không) ¶(other, context=None)

Tương tự như phương pháp

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
53, nhưng so sánh được thực hiện bằng cách sử dụng các giá trị tuyệt đối của các toán hạng.

________ 254 (Khác, bối cảnh = Không) ¶(other, context=None)

Giống như

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
55 ngoại trừ quy tắc làm tròn ngữ cảnh được áp dụng trước khi trả về và các giá trị
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 được báo hiệu hoặc bỏ qua (tùy thuộc vào ngữ cảnh và liệu chúng có báo hiệu hay yên tĩnh).

________ 257 (Khác, bối cảnh = Không) ¶(other, context=None)

Tương tự như phương pháp

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
58, nhưng so sánh được thực hiện bằng cách sử dụng các giá trị tuyệt đối của các toán hạng.

________ 259 (bối cảnh = không) ¶(context=None)

Trả về số lớn nhất có thể thể hiện trong bối cảnh đã cho (hoặc trong bối cảnh luồng hiện tại nếu không có ngữ cảnh nào được đưa ra) nhỏ hơn toán hạng đã cho.

________ 260 (bối cảnh = không) ¶(context=None)

Trả về số nhỏ nhất có thể thể hiện trong bối cảnh đã cho (hoặc trong bối cảnh luồng hiện tại nếu không có ngữ cảnh nào được đưa ra) lớn hơn toán hạng đã cho.

________ 261 (Khác, bối cảnh = Không) ¶(other, context=None)

Nếu hai toán hạng là không đồng đều, hãy trả lại số gần nhất với toán hạng đầu tiên theo hướng của toán hạng thứ hai. Nếu cả hai toán hạng đều bằng số, hãy trả về một bản sao của toán hạng đầu tiên với dấu hiệu được đặt giống như dấu hiệu của toán hạng thứ hai.

________ 262 (bối cảnh = không) ¶(context=None)

Bình thường hóa số bằng cách tước các số không theo dõi ngoài cùng bên phải và chuyển đổi bất kỳ kết quả nào bằng

>>> 0.1 + 0.2 == 0.3
False
18 thành
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
64. Được sử dụng để tạo ra các giá trị kinh điển cho các thuộc tính của một lớp tương đương. Ví dụ,
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
65 và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
66 đều bình thường hóa thành giá trị tương đương
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
67.

________ 268 (bối cảnh = không) ¶(context=None)

Trả về một chuỗi mô tả lớp của toán hạng. Giá trị trả về là một trong mười chuỗi sau.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    69, chỉ ra rằng toán hạng là vô cùng tiêu cực.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    70, chỉ ra rằng toán hạng là số bình thường âm.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    71, chỉ ra rằng toán hạng là âm và dưới mức.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    72, chỉ ra rằng toán hạng là số 0 âm.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    73, chỉ ra rằng toán hạng là số 0 dương.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    74, chỉ ra rằng toán hạng là dương và dưới mức.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    75, chỉ ra rằng toán hạng là số bình thường dương.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    76, chỉ ra rằng toán hạng là vô cùng dương tính.

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    77, chỉ ra rằng toán hạng là một nan yên tĩnh (không phải là một số).

  • >>> from decimal import Decimal
    >>> def ftod(val, prec = 15):   # float to Decimal
    ...     return Decimal(val).quantize(Decimal(10)**-prec)
    ... 
    >>> ftod(0.1) + ftod(0.2) == ftod(0.3)
    True
    
    78, chỉ ra rằng toán hạng là NAN báo hiệu.

________ 279 (exp, làm tròn = không, bối cảnh = không) ¶(exp, rounding=None, context=None)

Trả về một giá trị bằng với toán hạng đầu tiên sau khi làm tròn và có số mũ của toán hạng thứ hai.

>>> Decimal(10)**-4
Decimal('0.0001')
0

Không giống như các hoạt động khác, nếu độ dài của hệ số sau khi hoạt động lượng tử hóa sẽ lớn hơn độ chính xác, thì

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 được báo hiệu. Điều này đảm bảo rằng, trừ khi có một điều kiện lỗi, số mũ được định lượng luôn bằng với hoạt động bên phải.

Cũng không giống như các hoạt động khác, lượng tử hóa không bao giờ tín hiệu tăng, ngay cả khi kết quả là không bình thường và không chính xác.

Nếu số mũ của toán hạng thứ hai lớn hơn so với đầu tiên thì làm tròn có thể là cần thiết. Trong trường hợp này, chế độ làm tròn được xác định bằng đối số

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
81 nếu được đưa ra, khác bởi đối số
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
82 đã cho; Nếu không có đối số nào được đưa ra chế độ làm tròn của bối cảnh luồng hiện tại được sử dụng.

Một lỗi được trả về bất cứ khi nào số mũ kết quả lớn hơn

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
83 hoặc nhỏ hơn
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
84.

________ 285 ()()

Trả về

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
86, radix (cơ sở) trong đó lớp
>>> 0.1 + 0.2 == 0.3
False
12 thực hiện tất cả số học của nó. Bao gồm để tương thích với đặc điểm kỹ thuật.

________ 288 (Khác, bối cảnh = Không) ¶(other, context=None)

Trả lại phần còn lại từ việc chia cho bản thân cho người khác. Điều này khác với

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
89 ở chỗ dấu hiệu của phần còn lại được chọn để giảm thiểu giá trị tuyệt đối của nó. Chính xác hơn, giá trị trả về là
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
90 trong đó
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
91 là số nguyên gần nhất với giá trị chính xác của
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
92 và nếu hai số nguyên gần thì chẵn được chọn.

Nếu kết quả bằng không thì dấu hiệu của nó sẽ là dấu hiệu của bản thân.

>>> Decimal(10)**-4
Decimal('0.0001')
1

________ 293 (khác, bối cảnh = không) ¶(other, context=None)

Trả về kết quả quay các chữ số của toán hạng đầu tiên bằng một lượng được chỉ định bởi toán hạng thứ hai. Toán tử thứ hai phải là một số nguyên trong phạm vi -Crive thông qua độ chính xác. Giá trị tuyệt đối của toán hạng thứ hai cung cấp số lượng địa điểm để xoay. Nếu toán hạng thứ hai là dương thì xoay ở bên trái; Nếu không thì xoay ở bên phải. Hệ số của toán hạng đầu tiên được đệm ở bên trái với số không có độ chính xác chiều dài nếu cần thiết. Dấu hiệu và số mũ của toán hạng đầu tiên không thay đổi.

________ 294 (Khác, bối cảnh = Không) ¶(other, context=None)

Kiểm tra xem bản thân và người khác có cùng số mũ hay liệu cả hai đều là

>>> import math
>>> math.log10(2**53)
15.954589770191003
7.

Hoạt động này không bị ảnh hưởng bởi bối cảnh và im lặng: không có cờ nào được thay đổi và không có làm tròn nào được thực hiện. Như một ngoại lệ, phiên bản C có thể tăng không hợp lệ nếu toán hạng thứ hai không thể được chuyển đổi chính xác.

________ 296 (khác, bối cảnh = không) ¶(other, context=None)

Trả lại toán hạng đầu tiên với số mũ được điều chỉnh theo thứ hai. Tương tự, trả về toán hạng đầu tiên nhân với

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
97. Toán tử thứ hai phải là một số nguyên.

________ 298 (Khác, bối cảnh = Không) ¶(other, context=None)

Trả về kết quả của việc chuyển các chữ số của toán hạng đầu tiên bằng một lượng được chỉ định bởi toán hạng thứ hai. Toán tử thứ hai phải là một số nguyên trong phạm vi -Crive thông qua độ chính xác. Giá trị tuyệt đối của toán hạng thứ hai cho số lượng địa điểm thay đổi. Nếu toán hạng thứ hai là dương thì sự thay đổi ở bên trái; Nếu không thì sự thay đổi là bên phải. Các chữ số chuyển vào hệ số là số không. Dấu hiệu và số mũ của toán hạng đầu tiên không thay đổi.

________ 299 (bối cảnh = không) ¶(context=None)

Trả lại căn bậc hai của đối số về độ chính xác đầy đủ.

________ 300 (bối cảnh = không) ¶(context=None)

Chuyển đổi thành một chuỗi, sử dụng ký hiệu kỹ thuật nếu cần một số mũ.

Kỹ thuật ký hiệu có số mũ là bội số của 3. Điều này có thể để lại tới 3 chữ số ở bên trái của vị trí thập phân và có thể yêu cầu thêm một hoặc hai số không kéo dài.

Ví dụ, điều này chuyển đổi

>>> Decimal(10)**-4
Decimal('0.0001')
01 thành
>>> Decimal(10)**-4
Decimal('0.0001')
02.

________ 303 (làm tròn = không, bối cảnh = không) ¶(rounding=None, context=None)

Giống hệt với phương pháp

>>> Decimal(10)**-4
Decimal('0.0001')
04. Tên
>>> Decimal(10)**-4
Decimal('0.0001')
05 đã được giữ để tương thích với các phiên bản cũ hơn.

________ 306 (làm tròn = không, bối cảnh = không) ¶(rounding=None, context=None)

Vòng tròn đến số nguyên gần nhất, báo hiệu

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 hoặc
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
2 khi thích hợp nếu xảy ra làm tròn. Chế độ làm tròn được xác định bởi tham số
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
81 nếu được đưa ra, khác bởi
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
82 đã cho. Nếu không tham số nào được đưa ra thì chế độ làm tròn của bối cảnh hiện tại được sử dụng.

________ 311 (làm tròn = không, bối cảnh = không) ¶(rounding=None, context=None)

Tròn đến số nguyên gần nhất mà không có tín hiệu

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 hoặc
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
2. Nếu được đưa ra, áp dụng làm tròn; Mặt khác, sử dụng phương pháp làm tròn trong bối cảnh được cung cấp hoặc bối cảnh hiện tại.

Toán tử logic

Các phương thức

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
40,
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
43,
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
45 và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
48 mong đợi các đối số của họ là các toán hạng logic. Một toán hạng logic là một thể hiện
>>> 0.1 + 0.2 == 0.3
False
12 có số mũ và dấu hiệu cả bằng không và có các chữ số của họ đều là
>>> 0.1 + 0.2 == 0.3
False
23 hoặc
>>> 0.1 + 0.2 == 0.3
False
24.

Đối tượng bối cảnh lor

Bối cảnh là môi trường cho các hoạt động số học. Họ chi phối độ chính xác, đặt các quy tắc để làm tròn, xác định tín hiệu nào được coi là ngoại lệ và giới hạn phạm vi cho số mũ.

Mỗi luồng có ngữ cảnh hiện tại riêng được truy cập hoặc thay đổi bằng các hàm

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7 và
>>> 0.1 + 0.2 == 0.3
False
05:

________ 113 ________ 324 ()()

Trả về bối cảnh hiện tại cho chủ đề hoạt động.

________ 113 ________ 326 (c)(c)

Đặt bối cảnh hiện tại cho luồng hoạt động thành c.

Bạn cũng có thể sử dụng câu lệnh

>>> Decimal(10)**-4
Decimal('0.0001')
27 và hàm
>>> Decimal(10)**-4
Decimal('0.0001')
28 để tạm thời thay đổi bối cảnh hoạt động.

________ 113 ________ 330 (ctx = none) ¶(ctx=None)

Trả về Trình quản lý bối cảnh sẽ đặt bối cảnh hiện tại cho luồng hoạt động thành bản sao của CTX khi nhập vào thông báo và khôi phục bối cảnh trước đó khi thoát khỏi sự cố. Nếu không có ngữ cảnh nào được chỉ định, một bản sao của bối cảnh hiện tại được sử dụng.

Ví dụ: mã sau đây đặt độ chính xác thập phân hiện tại thành 42 vị trí, thực hiện tính toán và sau đó tự động khôi phục bối cảnh trước đó:

>>> Decimal(10)**-4
Decimal('0.0001')
2

Bối cảnh mới cũng có thể được tạo bằng trình xây dựng

>>> Decimal(10)**-4
Decimal('0.0001')
31 được mô tả dưới đây. Ngoài ra, mô-đun cung cấp ba bối cảnh được tạo sẵn:

Lớp ________ 113 ________ 333¶

Đây là một bối cảnh tiêu chuẩn được xác định bởi đặc tả số học thập phân chung. Độ chính xác được đặt thành chín. Làm tròn được đặt thành

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
5. Tất cả các cờ được xóa. Tất cả các bẫy được bật (được coi là ngoại lệ) ngoại trừ
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
2 và
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
3.

Bởi vì nhiều bẫy được bật, bối cảnh này rất hữu ích cho việc gỡ lỗi.

Lớp ________ 113 ________ 339¶

Đây là một bối cảnh tiêu chuẩn được xác định bởi đặc tả số học thập phân chung. Độ chính xác được đặt thành chín. Làm tròn được đặt thành

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
4. Tất cả các cờ được xóa. Không có bẫy được bật (để các ngoại lệ không được nâng lên trong quá trình tính toán).

Bởi vì các bẫy bị vô hiệu hóa, bối cảnh này rất hữu ích cho các ứng dụng thích có giá trị kết quả là

>>> import math
>>> math.log10(2**53)
15.954589770191003
7 hoặc
>>> import math
>>> math.log10(2**53)
15.954589770191003
5 thay vì nâng cao các ngoại lệ. Điều này cho phép một ứng dụng hoàn thành một cuộc chạy với sự hiện diện của các điều kiện nếu không nên tạm dừng chương trình.

Lớp ________ 113 ________ 344¶

Bối cảnh này được sử dụng bởi hàm tạo

>>> Decimal(10)**-4
Decimal('0.0001')
31 làm nguyên mẫu cho các bối cảnh mới. Thay đổi một trường (độ chính xác như vậy) có tác dụng thay đổi mặc định cho các bối cảnh mới được tạo bởi hàm tạo
>>> Decimal(10)**-4
Decimal('0.0001')
31.

Bối cảnh này hữu ích nhất trong các môi trường đa luồng. Thay đổi một trong các trường trước khi các luồng được bắt đầu có tác dụng thiết lập các mặc định trên toàn hệ thống. Thay đổi các trường sau khi các luồng đã bắt đầu không được khuyến nghị vì nó sẽ yêu cầu đồng bộ hóa luồng để ngăn chặn các điều kiện chủng tộc.

Trong các môi trường có ren đơn, tốt hơn là không sử dụng bối cảnh này. Thay vào đó, chỉ cần tạo bối cảnh rõ ràng như được mô tả dưới đây.

Các giá trị mặc định là ________ 347 = ________ 348, ________ 281 = ________ 84 và đã kích hoạt bẫy cho

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
4,
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 và
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0.

Ngoài ba bối cảnh được cung cấp, các bối cảnh mới có thể được tạo với hàm tạo

>>> Decimal(10)**-4
Decimal('0.0001')
31.

Lớp ________ 113 ________ 356 (prec = none, sunding = none, emin = none, emax = none, capitals = none, kẹp = không, cờ = không, bẫy = không) ¶(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)

Tạo ra một bối cảnh mới. Nếu một trường không được chỉ định hoặc là

>>> Decimal(10)**-4
Decimal('0.0001')
57, các giá trị mặc định được sao chép từ
>>> Decimal(10)**-4
Decimal('0.0001')
58. Nếu trường cờ không được chỉ định hoặc là
>>> Decimal(10)**-4
Decimal('0.0001')
57, tất cả các cờ đều được xóa.

PREP là một số nguyên trong phạm vi [

>>> 0.1 + 0.2 == 0.3
False
24,
>>> Decimal(10)**-4
Decimal('0.0001')
61] đặt độ chính xác cho các hoạt động số học trong bối cảnh.

Tùy chọn làm tròn là một trong những hằng số được liệt kê trong các chế độ làm tròn phần.

Các trường bẫy và cờ liệt kê bất kỳ tín hiệu nào được đặt. Nói chung, bối cảnh mới chỉ nên đặt bẫy và để lại những lá cờ rõ ràng.

Các trường Emin và Emax là các số nguyên chỉ định các giới hạn bên ngoài được phép cho số mũ. Emin phải nằm trong phạm vi [

>>> Decimal(10)**-4
Decimal('0.0001')
62,
>>> 0.1 + 0.2 == 0.3
False
23], Emax trong phạm vi [
>>> 0.1 + 0.2 == 0.3
False
23,
>>> Decimal(10)**-4
Decimal('0.0001')
65].

Trường thủ đô là

>>> 0.1 + 0.2 == 0.3
False
23 hoặc
>>> 0.1 + 0.2 == 0.3
False
24 (mặc định). Nếu được đặt thành
>>> 0.1 + 0.2 == 0.3
False
24, số mũ được in bằng vốn
>>> Decimal(10)**-4
Decimal('0.0001')
69; Mặt khác, chữ thường
>>> Decimal(10)**-4
Decimal('0.0001')
70 được sử dụng:
>>> Decimal(10)**-4
Decimal('0.0001')
71.

Trường kẹp là

>>> 0.1 + 0.2 == 0.3
False
23 (mặc định) hoặc
>>> 0.1 + 0.2 == 0.3
False
24. Nếu được đặt thành
>>> 0.1 + 0.2 == 0.3
False
24, số mũ
>>> Decimal(10)**-4
Decimal('0.0001')
70 của một thể hiện
>>> 0.1 + 0.2 == 0.3
False
12 có thể thể hiện trong bối cảnh này bị giới hạn nghiêm ngặt trong phạm vi
>>> Decimal(10)**-4
Decimal('0.0001')
77. Nếu kẹp là
>>> 0.1 + 0.2 == 0.3
False
23 thì một điều kiện yếu hơn giữ: số mũ được điều chỉnh của ví dụ
>>> 0.1 + 0.2 == 0.3
False
12 là tối đa
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
83. Khi kẹp là
>>> 0.1 + 0.2 == 0.3
False
24, một số lượng bình thường lớn sẽ, nếu có thể, có số mũ của nó giảm và số số không tương ứng được thêm vào hệ số của nó, để phù hợp với các ràng buộc số mũ; Điều này bảo tồn giá trị của số nhưng mất thông tin về số không có dấu vết đáng kể. Ví dụ:

>>> Decimal(10)**-4
Decimal('0.0001')
3

Giá trị kẹp của

>>> 0.1 + 0.2 == 0.3
False
24 cho phép tương thích với các định dạng trao đổi thập phân có chiều rộng cố định được chỉ định trong IEEE 754.

Lớp

>>> Decimal(10)**-4
Decimal('0.0001')
31 định nghĩa một số phương pháp mục đích chung cũng như một số lượng lớn các phương pháp để thực hiện số học trực tiếp trong một bối cảnh nhất định. Ngoài ra, đối với mỗi phương pháp
>>> 0.1 + 0.2 == 0.3
False
12 được mô tả ở trên (ngoại trừ các phương thức
>>> Decimal(10)**-4
Decimal('0.0001')
85 và
>>> Decimal(10)**-4
Decimal('0.0001')
86) có một phương pháp
>>> Decimal(10)**-4
Decimal('0.0001')
31 tương ứng. Ví dụ: đối với một ví dụ
>>> Decimal(10)**-4
Decimal('0.0001')
31
>>> Decimal(10)**-4
Decimal('0.0001')
89 và
>>> 0.1 + 0.2 == 0.3
False
12
>>> 0.1 + 0.2 == 0.3
False
54,
>>> Decimal(10)**-4
Decimal('0.0001')
92 tương đương với
>>> Decimal(10)**-4
Decimal('0.0001')
93. Mỗi phương thức
>>> Decimal(10)**-4
Decimal('0.0001')
31 chấp nhận một số nguyên python (một ví dụ là
>>> 0.1 + 0.2 == 0.3
False
39) bất cứ nơi nào mà một ví dụ thập phân được chấp nhận.

________ 396 ()()

Đặt lại tất cả các cờ thành

>>> 0.1 + 0.2 == 0.3
False
23.

________ 398 ()()

Đặt lại tất cả các bẫy về

>>> 0.1 + 0.2 == 0.3
False
23.

Mới trong phiên bản 3.3.

________ 400 ()()

Trả lại một bản sao của bối cảnh.

________ 401 (num) ¶(num)

Trả về một bản sao của số thập phân NUM.

________ 402 (num) ¶(num)

Tạo một ví dụ thập phân mới từ num nhưng sử dụng bản thân làm bối cảnh. Không giống như hàm tạo

>>> 0.1 + 0.2 == 0.3
False
12, phương pháp độ chính xác bối cảnh, phương pháp làm tròn, cờ và bẫy được áp dụng cho việc chuyển đổi.

Điều này rất hữu ích vì các hằng số thường được cung cấp cho một độ chính xác cao hơn so với ứng dụng cần thiết. Một lợi ích khác là làm tròn ngay lập tức loại bỏ các hiệu ứng ngoài ý muốn từ các chữ số vượt quá độ chính xác hiện tại. Trong ví dụ sau, sử dụng các đầu vào không có căn cứ có nghĩa là việc thêm 0 vào tổng có thể thay đổi kết quả:

>>> Decimal(10)**-4
Decimal('0.0001')
4

Phương pháp này thực hiện hoạt động số lượng của đặc tả IBM. Nếu đối số là một chuỗi, không được phép có khoảng trắng hoặc dấu gạch dưới hàng đầu.

________ 404 (f)(f)

Tạo một ví dụ thập phân mới từ một float f nhưng làm tròn bằng cách sử dụng bản thân làm bối cảnh. Không giống như phương pháp lớp

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
05, phương pháp độ chính xác ngữ cảnh, phương pháp làm tròn, cờ và bẫy được áp dụng cho việc chuyển đổi.

>>> Decimal(10)**-4
Decimal('0.0001')
5

Mới trong phiên bản 3.1.

________ 406 ()()

Trả về một giá trị bằng

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
07, là giá trị số mũ tối thiểu cho kết quả dưới mức. Khi dòng chảy xảy ra, số mũ được đặt thành
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
84.

________ 409 ()()

Trả về một giá trị bằng

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
10.

Cách tiếp cận thông thường để làm việc với số thập phân là tạo các trường hợp

>>> 0.1 + 0.2 == 0.3
False
12 và sau đó áp dụng các hoạt động số học diễn ra trong bối cảnh hiện tại cho luồng hoạt động. Một cách tiếp cận khác là sử dụng các phương thức bối cảnh để tính toán trong một bối cảnh cụ thể. Các phương pháp tương tự như các phương pháp cho lớp
>>> 0.1 + 0.2 == 0.3
False
12 và chỉ được kể lại ngắn gọn ở đây.

________ 413 (x)(x)

Trả về giá trị tuyệt đối của x.

________ 414 (x, y) ¶(x, y)

Trả lại tổng của x và y.

________ 164 (x)(x)

Trả về cùng một đối tượng thập phân x.

________ 166 (x, y)(x, y)

So sánh x và y bằng số.

________ 168 (x, y)(x, y)

So sánh các giá trị của hai toán hạng bằng số.

________ 170 (x, y)(x, y)

So sánh hai toán hạng bằng cách sử dụng đại diện trừu tượng của họ.

________ 177 (x, y) ¶(x, y)

So sánh hai toán hạng bằng cách sử dụng biểu diễn trừu tượng của họ, bỏ qua dấu hiệu.

________ 182 (x)(x)

Trả về một bản sao của x với dấu được đặt thành 0.

________ 183 (x)(x)

Trả về một bản sao của X với dấu hiệu đảo ngược.

________ 184 (x, y) ¶(x, y)

Sao chép dấu từ y đến x.

________ 423 (x, y)(x, y)

Trả lại x chia cho y.

________ 424 (x, y) ¶(x, y)

Trả lại x chia cho y, cắt ngắn thành một số nguyên.

________ 425 (x, y)(x, y)

Chia hai số và trả về phần số nguyên của kết quả.

________ 185 (x)(x)

Trả về

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
27.

________ 197 (x, y, z) ¶(x, y, z)

Trả về x nhân với y, cộng với z.

________ 198 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là chính tắc; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 203 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là hữu hạn; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 206 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là vô hạn; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 209 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là qnan hoặc snan; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 212 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là số bình thường; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 215 (x)(x)

Trả lại

>>> 0.1 + 0.2 == 0.3
False
99 nếu X là một nan yên tĩnh; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 218 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là âm; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 221 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu X là NAN báo hiệu; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 224 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x là dưới mức; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 227 (x)(x)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 nếu x bằng 0; Nếu không, trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00.

________ 230 (x)(x)

Trả về logarit tự nhiên (cơ sở e) của x.

________ 232 (x)(x)

Trả về cơ sở 10 logarit của x.

________ 234 (x)(x)

Trả về số mũ của cường độ của toán hạng MSD MSD.

________ 239 (x, y)(x, y)

Áp dụng hoạt động logic và giữa mỗi chữ số của toán hạng.

________ 242 (x)(x)

Đảo ngược tất cả các chữ số trong x.

________ 244 (x, y) ¶(x, y)

Áp dụng hoạt động logic hoặc giữa mỗi chữ số của toán hạng.

________ 247 (x, y) ¶(x, y)

Áp dụng hoạt động logic XOR giữa mỗi chữ số của toán hạng.

________ 249 (x, y) ¶(x, y)

So sánh hai giá trị bằng số và trả về tối đa.

________ 252 (x, y) ¶(x, y)

So sánh các giá trị bằng số với dấu hiệu của chúng bị bỏ qua.

________ 254 (x, y) ¶(x, y)

So sánh hai giá trị bằng số và trả về tối thiểu.

________ 257 (x, y) ¶(x, y)

So sánh các giá trị bằng số với dấu hiệu của chúng bị bỏ qua.

________ 254 (x, y) ¶(x)

So sánh hai giá trị bằng số và trả về tối thiểu.

________ 257 (x, y) ¶(x, y)

________ 470 (x)

Minus tương ứng với toán tử tiền tố Unary trừ trong Python.(x)

________ 471 (x, y) ¶

Trả lại sản phẩm của X và Y.(x)

________ 259 (x)

Trả về số đại diện lớn nhất nhỏ hơn x.(x, y)

________ 260 (x)

Trả về số đại diện nhỏ nhất lớn hơn x.(x)

________ 261 (x, y)

Trả về số gần nhất với x, theo hướng về y.(x)

________ 262 (x)

Giảm x xuống dạng đơn giản nhất của nó.(x)

________ 268 (x)

Trả về một dấu hiệu của lớp x.(x, y, modulo=None)

________ 477 (x)

Cộng với tương ứng với toán tử PREFIX Plus trong Python. Hoạt động này áp dụng độ chính xác và làm tròn ngữ cảnh, vì vậy nó không phải là một hoạt động nhận dạng.

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
86 dẫn đến
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 và nếu
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 không bị mắc kẹt, thì kết quả là
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
89.

Đã thay đổi trong phiên bản 3.3: Mô -đun C tính toán

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
90 theo các hàm
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
91 và
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
92 được làm tròn chính xác. Kết quả được xác định rõ nhưng chỉ có hầu như luôn luôn được làm tròn chính xác.The C module computes
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
90 in terms of the correctly rounded
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
91 and
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
92 functions. The result is well-defined but only “almost always correctly rounded”.

Với ba đối số, tính toán

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
93. Đối với biểu mẫu đối số ba, các hạn chế sau đối với các đối số giữ:

  • Cả ba đối số phải không thể thiếu

  • >>> 0.1 + 0.2 == 0.3
    False
    
    55 phải không âm

  • Ít nhất một trong số

    >>> 0.1 + 0.2 == 0.3
    False
    
    54 hoặc
    >>> 0.1 + 0.2 == 0.3
    False
    
    55 phải là không

  • >>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
    ...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
    ... 
    float:   0.100000000000000006
    float:   0.200000000000000011
    float:   0.299999999999999989
    Decimal: 0.100000000000000000
    Decimal: 0.200000000000000000
    Decimal: 0.300000000000000000
    
    81 phải là khác không và có nhiều nhất là các chữ số chính xác

Giá trị kết quả từ

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
98 bằng với giá trị sẽ thu được bằng cách tính toán
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
99 với độ chính xác không giới hạn, nhưng được tính toán hiệu quả hơn. Số mũ của kết quả bằng không, bất kể số mũ của
>>> 0.1 + 0.2 == 0.3
False
54,
>>> 0.1 + 0.2 == 0.3
False
55 và
>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
81. Kết quả luôn luôn chính xác.

________ 279 (x, y)(x, y)

Trả về một giá trị bằng x (tròn), có số mũ của y.

________ 285 ()()

Chỉ cần trả lại 10, vì đây là thập phân, :)

________ 505 (x, y) ¶(x, y)

Trả về phần còn lại từ bộ phận số nguyên.

Dấu hiệu của kết quả, nếu khác không, giống như cổ tức ban đầu.

________ 288 (x, y)(x, y)

Trả về

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
07, trong đó n là số nguyên gần nhất là giá trị chính xác của
>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
08 (nếu kết quả là 0 thì dấu của nó sẽ là dấu hiệu của x).

________ 293 (x, y)(x, y)

Trả về một bản sao xoay của x, y lần.

________ 294 (x, y)(x, y)

Trả về

>>> 0.1 + 0.2 == 0.3
False
99 Nếu hai toán hạng có cùng số mũ.

________ 296 (x, y)(x, y)

Trả về toán hạng đầu tiên sau khi thêm giá trị thứ hai exp của nó.

________ 298 (x, y)(x, y)

Trả về một bản sao thay đổi của X, Y Times.

________ 299 (x)(x)

Căn bậc hai của một số không âm đến độ chính xác ngữ cảnh.

________ 515 (x, y)(x, y)

Trả về sự khác biệt giữa x và y.

________ 300 (x)(x)

Chuyển đổi thành một chuỗi, sử dụng ký hiệu kỹ thuật nếu cần một số mũ.

Kỹ thuật ký hiệu có số mũ là bội số của 3. Điều này có thể để lại tới 3 chữ số ở bên trái của vị trí thập phân và có thể yêu cầu thêm một hoặc hai số không kéo dài.

________ 306 (x)(x)

Vòng vào một số nguyên.

________ 518 (x)(x)

Chuyển đổi một số thành một chuỗi bằng cách sử dụng ký hiệu khoa học.

Hằng số trong

Các hằng số trong phần này chỉ liên quan đến mô -đun C. Chúng cũng được bao gồm trong phiên bản Python Pure Python để tương thích.

32-bit

64-bit

________ 113 ________ 520¶

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
21

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
22

________ 113 ________ 524¶

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
21

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
22

________ 113 ________ 528¶

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
29

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
30

________ 113 ________ 532¶

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
33

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
34

________ 113 ________ 536¶

Giá trị là

>>> 0.1 + 0.2 == 0.3
False
99. Không dùng nữa, bởi vì Python bây giờ luôn có chủ đề.

Không dùng nữa kể từ phiên bản 3.9.

________ 113 ________ 539¶

Giá trị mặc định là

>>> 0.1 + 0.2 == 0.3
False
99. Nếu Python là
>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
41, phiên bản C sử dụng một địa phương thay vì bối cảnh coroutine-local và giá trị là
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00. Điều này nhanh hơn một chút trong một số kịch bản bối cảnh lồng nhau.

Mới trong phiên bản 3.9: Được ba chiều đến 3,7 và 3,8.backported to 3.7 and 3.8.

Chế độ làm tròn

________ 113 ________ 544¶

Vòng hướng về

>>> import math
>>> math.log10(2**53)
15.954589770191003
5.

________ 113 ________ 547¶

Vòng về phía 0.

________ 113 ________ 549¶

Vòng quay về phía

>>> import math
>>> math.log10(2**53)
15.954589770191003
6.

________ 113 ________ 552¶

Vòng đến gần nhất với các mối quan hệ đi về phía 0.

________ 113 ________ 554¶

Vòng đến gần nhất với các mối quan hệ đi đến gần nhất thậm chí số nguyên.

________ 113 ________ 556¶

Vòng đến gần nhất với các mối quan hệ đi xa từ số không.

________ 113 ________ 558¶

Làm tròn từ số không.

________ 113 ________ 560¶

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 tròn về phía bằng không.

Tín hiệu/

Tín hiệu đại diện cho các điều kiện phát sinh trong quá trình tính toán. Mỗi tương ứng với một cờ bối cảnh và một trình tạo bẫy ngữ cảnh.

Cờ bối cảnh được đặt bất cứ khi nào điều kiện gặp phải. Sau khi tính toán, các cờ có thể được kiểm tra cho các mục đích thông tin (ví dụ, để xác định xem việc tính toán có chính xác hay không). Sau khi kiểm tra các cờ, hãy chắc chắn xóa tất cả các cờ trước khi bắt đầu tính toán tiếp theo.

Nếu bộ tạo bẫy bẫy ngữ cảnh được đặt cho tín hiệu, thì điều kiện này sẽ gây ra ngoại lệ python. Ví dụ: nếu bẫy

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0 được đặt, thì ngoại lệ
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0 được tăng lên khi gặp phải điều kiện.

Lớp ________ 113 ________ 564¶

Thay đổi một số mũ để phù hợp với các ràng buộc đại diện.

Thông thường, việc kẹp xảy ra khi một số mũ nằm ngoài bối cảnh giới hạn

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
65 và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
83. Nếu có thể, số mũ được giảm để phù hợp bằng cách thêm số không vào hệ số.

Lớp ________ 113 ________ 568¶

Lớp cơ sở cho các tín hiệu khác và một lớp con của

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
69.

Lớp ________ 113 ________ 571¶

Báo hiệu sự phân chia của một số không vô hạn theo 0.

Có thể xảy ra với sự phân chia, phân chia modulo hoặc khi nâng một số lên một sức mạnh tiêu cực. Nếu tín hiệu này không bị mắc kẹt, trả về

>>> import math
>>> math.log10(2**53)
15.954589770191003
5 hoặc
>>> import math
>>> math.log10(2**53)
15.954589770191003
6 với dấu hiệu được xác định bởi các đầu vào cho phép tính.

Lớp ________ 113 ________ 575¶

Chỉ ra rằng làm tròn xảy ra và kết quả là không chính xác.

Tín hiệu khi các chữ số khác không bị loại bỏ trong quá trình làm tròn. Kết quả tròn được trả lại. Cờ tín hiệu hoặc bẫy được sử dụng để phát hiện khi kết quả không chính xác.

Lớp ________ 113 ________ 577¶

Một hoạt động không hợp lệ đã được thực hiện.

Chỉ ra rằng một hoạt động đã được yêu cầu không có ý nghĩa. Nếu không bị mắc kẹt, trả về

>>> import math
>>> math.log10(2**53)
15.954589770191003
7. Nguyên nhân có thể bao gồm:

>>> Decimal(10)**-4
Decimal('0.0001')
6

Lớp ________ 113 ________ 580¶

Tràn số.

Cho biết số mũ lớn hơn

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
83 sau khi làm tròn đã xảy ra. Nếu không bị mắc kẹt, kết quả phụ thuộc vào chế độ làm tròn, hoặc kéo vào trong số lượng hữu hạn lớn nhất có thể đại diện hoặc làm tròn ra ngoài đến
>>> import math
>>> math.log10(2**53)
15.954589770191003
5. Trong cả hai trường hợp,
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 và
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
2 cũng được báo hiệu.

Lớp ________ 113 ________ 586¶

Làm tròn xảy ra mặc dù có thể không có thông tin bị mất.

Báo hiệu bất cứ khi nào làm tròn loại bỏ các chữ số; Ngay cả khi các chữ số đó bằng không (chẳng hạn như làm tròn

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
87 đến
>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
88). Nếu không bị mắc kẹt, trả về kết quả không thay đổi. Tín hiệu này được sử dụng để phát hiện mất các chữ số quan trọng.

Lớp ________ 113 ________ 590¶

Số mũ thấp hơn

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
65 trước khi làm tròn.

Xảy ra khi kết quả hoạt động là dưới mức (số mũ quá nhỏ). Nếu không bị mắc kẹt, trả về kết quả không thay đổi.

Lớp ________ 113 ________ 593¶

Dòng chảy số với kết quả được làm tròn đến 0.

Xảy ra khi một kết quả dưới mức được đẩy về 0 bằng cách làm tròn.

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 và
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
3 cũng được báo hiệu.

Lớp ________ 113 ________ 597¶

Cho phép ngữ nghĩa chặt chẽ hơn để trộn phao và số thập phân.

Nếu tín hiệu không bị mắc kẹt (mặc định), trộn các phao và số thập phân được cho phép trong hàm tạo

>>> 0.1 + 0.2 == 0.3
False
12,
>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
99 và tất cả các toán tử so sánh. Cả chuyển đổi và so sánh là chính xác. Bất kỳ sự xuất hiện nào của một hoạt động hỗn hợp đều được ghi lại âm thầm bằng cách đặt
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6 trong các cờ ngữ cảnh. Chuyển đổi rõ ràng với
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
01 hoặc
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
02 không đặt cờ.

Mặt khác (tín hiệu bị mắc kẹt), chỉ so sánh bình đẳng và chuyển đổi rõ ràng là im lặng. Tất cả các hoạt động hỗn hợp khác tăng

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
6.

Bảng sau đây tóm tắt phân cấp tín hiệu:

>>> Decimal(10)**-4
Decimal('0.0001')
7

Ghi chú điểm nổi

Giảm thiểu lỗi làm tròn với độ chính xác tăng

Việc sử dụng điểm nổi thập phân giúp loại bỏ lỗi biểu diễn thập phân (chính xác là biểu hiện chính xác

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
04); Tuy nhiên, một số hoạt động vẫn có thể gây ra lỗi làm tròn khi các chữ số khác không vượt quá độ chính xác cố định.

Các ảnh hưởng của lỗi làm tròn có thể được khuếch đại bằng cách bổ sung hoặc trừ các số lượng gần như bù đắp dẫn đến mất ý nghĩa. Knuth cung cấp hai ví dụ mang tính hướng dẫn trong đó số học điểm nổi tròn với độ chính xác không đủ gây ra sự cố của các thuộc tính liên kết và phân phối của việc bổ sung:

>>> Decimal(10)**-4
Decimal('0.0001')
8

Mô -đun

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
1 cho phép khôi phục danh tính bằng cách mở rộng độ chính xác đủ để tránh mất ý nghĩa:

>>> Decimal(10)**-4
Decimal('0.0001')
9

Giá trị đặc biệt

Hệ thống số cho mô -đun

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
1 cung cấp các giá trị đặc biệt bao gồm
>>> import math
>>> math.log10(2**53)
15.954589770191003
7,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
08,
>>> import math
>>> math.log10(2**53)
15.954589770191003
6,
>>> import math
>>> math.log10(2**53)
15.954589770191003
5 và hai số 0,
>>> import math
>>> math.log10(2**53)
15.954589770191003
9 và
>>> import math
>>> math.log10(2**53)
15.954589770191003
8.

Tính không đồng nhất có thể được xây dựng trực tiếp với:

>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
38. Ngoài ra, chúng có thể phát sinh từ việc chia cho 0 khi tín hiệu
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
0 không bị mắc kẹt. Tương tự như vậy, khi tín hiệu
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
4 không bị mắc kẹt, vô cực có thể là kết quả của việc làm tròn vượt quá giới hạn của số đại diện lớn nhất.

Các tính không đồng thời được ký kết (affine) và có thể được sử dụng trong các hoạt động số học nơi chúng được đối xử là những con số rất lớn, không xác định. Chẳng hạn, việc thêm một hằng số vào vô cực cho kết quả vô hạn khác.

Một số hoạt động không xác định và trả về

>>> import math
>>> math.log10(2**53)
15.954589770191003
7 hoặc nếu tín hiệu
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 bị mắc kẹt, hãy tăng một ngoại lệ. Ví dụ:
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
18 trả về
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 có nghĩa là không phải là một số. Sự đa dạng của
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 này là yên tĩnh và, một khi được tạo ra, sẽ chảy qua các tính toán khác luôn dẫn đến một
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 khác. Hành vi này có thể hữu ích cho một loạt các tính toán đôi khi bị thiếu đầu vào - nó cho phép tính toán tiến hành trong khi gắn cờ các kết quả cụ thể là không hợp lệ.

Một biến thể là

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
08 báo hiệu thay vì giữ im lặng sau mỗi hoạt động. Đây là một giá trị trả lại hữu ích khi kết quả không hợp lệ cần làm gián đoạn tính toán để xử lý đặc biệt.

Hành vi của các nhà khai thác so sánh Python có thể hơi ngạc nhiên khi có liên quan đến

>>> import math
>>> math.log10(2**53)
15.954589770191003
7. Một bài kiểm tra cho sự bình đẳng trong đó một trong các toán hạng là một sự yên tĩnh hoặc tín hiệu
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 luôn trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 (ngay cả khi thực hiện
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
26), trong khi một bài kiểm tra cho sự bất bình đẳng luôn trả về
>>> 0.1 + 0.2 == 0.3
False
99. Một nỗ lực để so sánh hai số thập phân bằng cách sử dụng bất kỳ toán tử
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
28,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
29,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
30 hoặc
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
31 nào sẽ tăng tín hiệu
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')
9 nếu một trong hai toán hạng là
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 và trả về
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
00 nếu tín hiệu này không bị mắc kẹt. Lưu ý rằng đặc tả số học thập phân chung không chỉ định hành vi so sánh trực tiếp; Các quy tắc này để so sánh liên quan đến
>>> import math
>>> math.log10(2**53)
15.954589770191003
7 đã được lấy từ tiêu chuẩn IEEE 854 (xem Bảng 3 trong Phần 5.7). Để đảm bảo tuân thủ các tiêu chuẩn nghiêm ngặt, thay vào đó, hãy sử dụng các phương thức
>>> 0.1 + 0.2 == 0.3
False
67 và
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
37.

Các số không có chữ ký có thể là kết quả của các tính toán mà dòng chảy. Họ giữ các dấu hiệu sẽ dẫn đến nếu tính toán đã được thực hiện đến độ chính xác cao hơn. Vì cường độ của chúng bằng không, cả các số 0 dương và âm được coi là bằng nhau và dấu hiệu của chúng là thông tin.

Ngoài hai số không có chữ ký khác biệt nhưng có nhiều biểu diễn khác nhau có số 0 với các giá trị khác nhau vẫn tương đương về giá trị. Điều này mất một chút làm quen. Đối với một mắt quen thuộc với các biểu diễn điểm nổi được chuẩn hóa, không rõ ràng rằng tính toán sau đây trả về một giá trị bằng 0:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
0

Làm việc với chủ đề

Hàm

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7 truy cập vào một đối tượng
>>> Decimal(10)**-4
Decimal('0.0001')
31 khác nhau cho mỗi luồng. Có bối cảnh luồng riêng biệt có nghĩa là các luồng có thể thực hiện các thay đổi (chẳng hạn như
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
40) mà không can thiệp vào các luồng khác.

Tương tự như vậy, hàm

>>> 0.1 + 0.2 == 0.3
False
05 tự động gán mục tiêu của nó cho luồng hiện tại.

Nếu

>>> 0.1 + 0.2 == 0.3
False
05 chưa được gọi trước
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7, thì
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7 sẽ tự động tạo bối cảnh mới để sử dụng trong luồng hiện tại.

Bối cảnh mới được sao chép từ bối cảnh nguyên mẫu gọi là DefaultContext. Để kiểm soát các mặc định để mỗi luồng sẽ sử dụng cùng một giá trị trong toàn bộ ứng dụng, hãy trực tiếp sửa đổi đối tượng DefaultContext. Điều này nên được thực hiện trước khi bất kỳ chủ đề nào được bắt đầu để có được một điều kiện cuộc đua giữa các luồng gọi

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
7. Ví dụ:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
1

Công thức nấu ăn¶

Dưới đây là một vài công thức nấu ăn là chức năng tiện ích và thể hiện các cách để làm việc với lớp

>>> 0.1 + 0.2 == 0.3
False
12:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
2

Câu hỏi thường gặp về thập phân

Q. Nó là cồng kềnh để loại

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
47. Có cách nào để giảm thiểu việc gõ khi sử dụng trình thông dịch tương tác không?

A. Một số người dùng viết tắt hàm tạo thành một chữ cái:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
3

Q. Trong một ứng dụng điểm cố định với hai vị trí thập phân, một số đầu vào có nhiều nơi và cần phải được làm tròn. Những người khác không được phép có các chữ số dư thừa và cần phải được xác nhận. Những phương pháp nào nên được sử dụng?

A. Phương pháp

>>> 0.1 + 0.2 == 0.3
False
03 làm tròn đến một số vị trí thập phân cố định. Nếu bẫy
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 được đặt, nó cũng hữu ích để xác thực:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
4

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
5

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
6

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
7

Q. Khi tôi có hai đầu vào hai địa điểm hợp lệ, làm thế nào để duy trì bất biến đó trong suốt một ứng dụng?

A. Một số hoạt động như bổ sung, trừ và phép nhân bằng một số nguyên sẽ tự động bảo tồn điểm cố định. Các hoạt động khác, như phép nhân phân chia và không số nguyên, sẽ thay đổi số lượng vị trí thập phân và cần phải được theo dõi với bước

>>> 0.1 + 0.2 == 0.3
False
03:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
8

Trong việc phát triển các ứng dụng điểm cố định, thật thuận tiện khi xác định các chức năng để xử lý bước

>>> 0.1 + 0.2 == 0.3
False
03:

>>> for x in [0.1, 0.2, 0.3, ftod(0.1), ftod(0.2), ftod(0.3)]:
...     print("{:8} {:.18f}".format(type(x).__name__+":", x))
... 
float:   0.100000000000000006
float:   0.200000000000000011
float:   0.299999999999999989
Decimal: 0.100000000000000000
Decimal: 0.200000000000000000
Decimal: 0.300000000000000000
9

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
0

Q. Có nhiều cách để thể hiện cùng một giá trị. Các số

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
52,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
53,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
54 và
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
55 đều có cùng giá trị ở các quy tắc khác nhau. Có cách nào để biến chúng thành một giá trị kinh điển có thể nhận ra duy nhất không?

A. Phương pháp

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
56 ánh xạ tất cả các giá trị tương đương vào một đại diện duy nhất:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
1

Q. Một số giá trị thập phân luôn in với ký hiệu theo cấp số nhân. Có cách nào để có được một đại diện không theo nhân viên không?

A. Đối với một số giá trị, ký hiệu theo cấp số nhân là cách duy nhất để thể hiện số lượng vị trí quan trọng trong hệ số. Ví dụ, biểu thị

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
57 là
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
58 giữ giá trị không đổi nhưng không thể hiển thị ý nghĩa hai vị trí ban đầu.

Nếu một ứng dụng không quan tâm đến việc theo dõi ý nghĩa, thì dễ dàng loại bỏ số mũ và số không, mất ý nghĩa, nhưng giữ cho giá trị không thay đổi:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
2

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
3

Q. Có cách nào để chuyển đổi một chiếc phao thông thường thành

>>> 0.1 + 0.2 == 0.3
False
12 không?

A. Có, bất kỳ số điểm nổi nhị phân nào cũng có thể được biểu thị chính xác dưới dạng thập phân mặc dù chuyển đổi chính xác có thể có độ chính xác hơn so với trực giác sẽ đề xuất:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
4

H: Trong một tính toán phức tạp, làm thế nào tôi có thể đảm bảo rằng tôi đã nhận được một kết quả giả vì không đủ độ chính xác hoặc làm tròn dị thường.

A. Mô -đun thập phân giúp bạn dễ dàng kiểm tra kết quả. Một thực tiễn tốt nhất là chạy lại các tính toán bằng cách sử dụng độ chính xác cao hơn và với các chế độ làm tròn khác nhau. Kết quả khác nhau cho thấy độ chính xác không đủ, các vấn đề chế độ làm tròn, đầu vào không điều hòa hoặc thuật toán không ổn định về số lượng.

H: Tôi nhận thấy rằng độ chính xác ngữ cảnh được áp dụng cho kết quả hoạt động nhưng không phải là đầu vào. Có bất cứ điều gì để coi chừng khi trộn các giá trị của các quy định khác nhau?

A. Có. Nguyên tắc là tất cả các giá trị được coi là chính xác và số học trên các giá trị đó cũng vậy. Chỉ có kết quả được làm tròn. Ưu điểm cho các đầu vào là những gì bạn gõ là những gì bạn nhận được. Một bất lợi là kết quả có thể trông kỳ lạ nếu bạn quên rằng các đầu vào đã được làm tròn:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
5

Giải pháp là tăng độ chính xác hoặc buộc làm tròn các đầu vào bằng cách sử dụng hoạt động Unary Plus:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
6

Ngoài ra, các đầu vào có thể được làm tròn khi tạo bằng phương pháp

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
60:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
7

Q. Việc triển khai CPython có nhanh cho số lượng lớn không?

A. Có. Trong các triển khai Cpython và Pypy3, các phiên bản C/CFFI của mô-đun thập phân tích hợp thư viện LibMPDEC tốc độ cao để có độ chính xác theo độ chính xác chính xác số.

Bối cảnh phải được điều chỉnh cho số học chính xác tùy ý chính xác.

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
65 và
>>> from decimal import Decimal
>>> def ftod(val, prec = 15):   # float to Decimal
...     return Decimal(val).quantize(Decimal(10)**-prec)
... 
>>> ftod(0.1) + ftod(0.2) == ftod(0.3)
True
83 phải luôn được đặt thành các giá trị tối đa,
>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
64 phải luôn là 0 (mặc định). Cài đặt
>>> Decimal(10)**-4
Decimal('0.0001')
47 yêu cầu một số chăm sóc.

Cách tiếp cận dễ nhất để thử số học Bignum là sử dụng giá trị tối đa cho

>>> Decimal(10)**-4
Decimal('0.0001')
47 cũng như 2:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
8

Đối với kết quả không chính xác,

>>> Decimal(10)**-4
Decimal('0.0001')
61 quá lớn trên các nền tảng 64 bit và bộ nhớ có sẵn sẽ không đủ:

>>> for p in [15, 16, 17]:
...     print("Rounding precision: {}. Check  0.1 + 0.2 == 0.3  is {}".format(p,
...         ftod(0.1, p) + ftod(0.2, p) == ftod(0.3, p)))
... 
Rounding precision: 15. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 16. Check  0.1 + 0.2 == 0.3  is True
Rounding precision: 17. Check  0.1 + 0.2 == 0.3  is False
9

Trên các hệ thống có tổng thể (ví dụ: Linux), một cách tiếp cận tinh vi hơn là điều chỉnh

>>> Decimal(10)**-4
Decimal('0.0001')
47 theo lượng RAM có sẵn. Giả sử rằng bạn có 8GB RAM và mong đợi 10 toán hạng đồng thời bằng cách sử dụng tối đa 500MB mỗi lần:

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
0

Nói chung (và đặc biệt là trên các hệ thống không có tổng thể), nên ước tính các giới hạn chặt chẽ hơn và đặt bẫy

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
        capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
        InvalidOperation])

>>> getcontext().prec = 7       # Set a new precision
1 nếu tất cả các tính toán được dự kiến ​​là chính xác.

1

Mới trong phiên bản 3.3.

2

Đã thay đổi trong phiên bản 3.9: Cách tiếp cận này hiện hoạt động cho tất cả các kết quả chính xác ngoại trừ các quyền hạn không định nghĩa.This approach now works for all exact results except for non-integer powers.

Làm thế nào để bạn chuyển đổi float thành thập phân?

Các quy tắc để chuyển đổi một số điểm nổi thành thập phân chỉ đơn giản là để đảo ngược chuyển đổi dấu thập phân sang nổi: Nếu số gốc là trong HEX, hãy chuyển đổi nó thành nhị phân.Tách thành các trường dấu hiệu, số mũ và mantissa.Trích xuất mantissa từ trường Mantissa, và khôi phục lại hàng đầu.reverse of the decimal to floating point conversion: If the original number is in hex, convert it to binary. Separate into the sign, exponent, and mantissa fields. Extract the mantissa from the mantissa field, and restore the leading one.

Làm thế nào để bạn chuyển đổi một số thập phân thành một chiếc phao trong Python?

Có hai phương thức: float_number = float (decimal_number) float_number = decimal_number * 1.0.float_number = float ( decimal_number ) float_number = decimal_number * 1.0.

Làm thế nào để bạn in phao đến 2 số thập phân trong Python?

Ví dụ 2: Làm thế nào để giới hạn phao đến hai số thập phân trong Python..
Sử dụng phần trăm%:- toán tử%của%được sử dụng để định dạng cũng như đặt độ chính xác trong Python.....
Sử dụng định dạng ():- Đây là một cách khác để định dạng chuỗi để cài đặt độ chính xác ..

Làm thế nào để bạn đổi thành thập phân trong Python?

Trong Python, bạn chỉ có thể sử dụng hàm bin () để chuyển đổi từ giá trị thập phân sang giá trị nhị phân tương ứng của nó.Và tương tự, hàm int () để chuyển đổi một nhị phân thành giá trị thập phân của nó.use the bin() function to convert from a decimal value to its corresponding binary value. And similarly, the int() function to convert a binary to its decimal value.