Hướng dẫn how do you set floating points in python? - làm thế nào để bạn đặt dấu chấm động trong python?

Tldr;)

Vấn đề làm tròn của đầu vào và đầu ra đã được giải quyết dứt khoát bằng Python 3.1 và bản sửa lỗi cũng được đưa vào Python 2.7.0.solved definitively by Python 3.1 and the fix is backported also to Python 2.7.0.

Các số tròn có thể được chuyển đổi đảo ngược giữa phao và chuỗi qua lại:

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
2 hoặc
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
3
back and forth:
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
2 or
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
3

>>> 0.3
0.3
>>> float(repr(0.3)) == 0.3
True

Một loại

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
4 là không cần thiết để lưu trữ nữa.

Kết quả của các hoạt động số học phải được làm tròn một lần nữa vì các lỗi làm tròn có thể tích lũy không chính xác hơn so với điều đó có thể xảy ra sau khi phân tích một số. Không được cố định bởi thuật toán

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
5 được cải thiện (Python> = 3.1,> = 2.7.0): because rounding errors could accumulate more inaccuracy than that is possible after parsing one number. That is not fixed by the improved
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
5 algorithm (Python >= 3.1, >= 2.7.0):

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)

The output string function

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
6 was rounded to 12 valid digits in Python < 2.7x and < 3.1, to prevent excessive invalid digits similar to unfixed repr() output. That was still insufficientl after subtraction of very similar numbers and it was too much rounded after other operations. Python 2.7 and 3.1 use the same length of str() although the repr() is fixed. Some old versions of Numpy had also excessive invalid digits, even with fixed Python. The current Numpy is fixed. Python versions >= 3.2 have the same results of str() and repr() function and also output of similar functions in Numpy.


Bài kiểm tra

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.

Tài liệu

Xem Ghi chú phát hành Python 2.7 - Ngôn ngữ khác thay đổi đoạn thứ tư:

Chuyển đổi giữa các số dấu phẩy động và chuỗi hiện được làm tròn chính xác trên hầu hết các nền tảng. Những chuyển đổi này xảy ra ở nhiều nơi khác nhau: str () trên phao và số phức; các nhà xây dựng nổi và phức tạp; định dạng số; tuần tự hóa và khử tự động các phao và số phức bằng các mô-đun

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
7,
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
8 và
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
9; phân tích cú pháp phao và văn học tưởng tượng trong mã Python; và chuyển đổi thập phân sang phao.
between floating-point numbers and strings are now correctly rounded on most platforms. These conversions occur in many different places: str() on floats and complex numbers; the float and complex constructors; numeric formatting; serializing and de-serializing floats and complex numbers using the
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
7,
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
8 and
import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
9 modules; parsing of float and imaginary literals in Python code; and Decimal-to-float conversion.

Liên quan đến điều này, phần repr () của số điểm nổi x hiện đang trả về kết quả dựa trên chuỗi thập phân ngắn nhất mà Lọ đảm bảo quay trở lại X dưới cách làm tròn chính xác (với chế độ làm tròn nửa vòng tròn). Trước đây, nó đã đưa ra một chuỗi dựa trên làm tròn x đến 17 chữ số thập phân.repr() of a floating-point number x now returns a result based on the shortest decimal string that’s guaranteed to round back to x under correct rounding (with round-half-to-even rounding mode). Previously it gave a string based on rounding x to 17 decimal digits.

Vấn đề liên quan


Thông tin thêm: Định dạng

0.0001100110011001100110011001100110011001100110011...
0 trước Python 2.7 tương tự như
0.0001100110011001100110011001100110011001100110011...
1 hiện tại. Cả hai loại đều sử dụng cùng độ chính xác gấp đôi của IEEE 754 với 52 bit mantissa. Một sự khác biệt lớn là
0.0001100110011001100110011001100110011001100110011...
2 được định dạng thường xuyên với số thập phân quá mức để không thể mất một chút, nhưng không có số IEEE 754 hợp lệ tồn tại trong khoảng 13.94999999999999 và 13.9500000000001. Kết quả là không tốt và chuyển đổi
0.0001100110011001100110011001100110011001100110011...
3 không thể đảo ngược với Numpy. Mặt khác:
0.0001100110011001100110011001100110011001100110011...
4 được định dạng để mọi chữ số đều quan trọng; Trình tự là không có khoảng trống và chuyển đổi có thể đảo ngược. Đơn giản: Nếu bạn có thể có số Numpy.Loat64, hãy chuyển đổi nó thành phao bình thường để được định dạng cho con người, không phải cho bộ xử lý số, nếu không thì không có gì cần thiết hơn với Python 2.7+.
The formatting of
0.0001100110011001100110011001100110011001100110011...
0 before Python 2.7 was similar to the current
0.0001100110011001100110011001100110011001100110011...
1. Both types use the same 64 bit IEEE 754 double precision with 52 bit mantissa. A big difference is that
0.0001100110011001100110011001100110011001100110011...
2 is formatted frequently with an excessive decimal number so that no bit can be lost, but no valid IEEE 754 number exists between 13.949999999999999 and 13.950000000000001. The result is not nice and the conversion
0.0001100110011001100110011001100110011001100110011...
3 is not reversible with numpy. On the other hand:
0.0001100110011001100110011001100110011001100110011...
4 is formatted so that every digit is important; the sequence is without gaps and the conversion is reversible. Simply: If you perhaps have a numpy.float64 number, convert it to normal float in order to be formatted for humans, not for numeric processors, otherwise nothing more is necessary with Python 2.7+.

15. Số học dấu phẩy động: Các vấn đề và giới hạnFloating Point Arithmetic: Issues and Limitations¶

Số điểm nổi được thể hiện trong phần cứng máy tính dưới dạng phân số cơ sở 2 (nhị phân). Ví dụ: phân số thập phân

0.0001100110011001100110011001100110011001100110011...
5 có giá trị 1/10 + 2/100 + 5/1000, và theo cách tương tự phần nhị phân
0.0001100110011001100110011001100110011001100110011...
6 có giá trị 0/2 + 0/4 + 1/8. Hai phân số này có các giá trị giống hệt nhau, sự khác biệt thực sự duy nhất là phần đầu tiên được viết trong ký hiệu phân số cơ sở 10 và thứ hai trong cơ sở 2.decimal fraction
0.0001100110011001100110011001100110011001100110011...
5 has value 1/10 + 2/100 + 5/1000, and in the same way the binary fraction
0.0001100110011001100110011001100110011001100110011...
6 has value 0/2 + 0/4 + 1/8. These two fractions have identical values, the only real difference being that the first is written in base 10 fractional notation, and the second in base 2.

Thật không may, hầu hết các phân số thập phân không thể được biểu diễn chính xác dưới dạng phân số nhị phân. Một hậu quả là, nói chung, các số điểm nổi thập phân bạn nhập chỉ được xấp xỉ bằng các số điểm nổi nhị phân thực sự được lưu trữ trong máy.

Vấn đề dễ hiểu hơn lúc đầu trong cơ sở 10. Xem xét phân số 1/3. Bạn có thể xấp xỉ đó là một phân số cơ sở 10:

hoặc tốt hơn,

hoặc tốt hơn,

và như thế. Cho dù bạn có sẵn sàng viết ra bao nhiêu chữ số, kết quả sẽ không bao giờ chính xác là 1/3, nhưng sẽ là xấp xỉ ngày càng tốt hơn 1/3.

Theo cách tương tự, cho dù có bao nhiêu chữ số cơ sở mà bạn sẵn sàng sử dụng, giá trị thập phân 0.1 không thể được biểu diễn chính xác dưới dạng phân số cơ sở 2. Trong cơ sở 2, 1/10 là phần lặp lại vô hạn

0.0001100110011001100110011001100110011001100110011...

Dừng lại ở bất kỳ số lượng bit hữu hạn, và bạn nhận được một xấp xỉ. Trên hầu hết các máy ngày nay, các phao được xấp xỉ bằng cách sử dụng phần nhị phân với tử số sử dụng 53 bit đầu tiên bắt đầu với bit quan trọng nhất và với mẫu số làm sức mạnh của hai. Trong trường hợp 1/10, phần nhị phân là

0.0001100110011001100110011001100110011001100110011...
7 gần với nhưng không chính xác bằng giá trị thực là 1/10.

Nhiều người dùng không nhận thức được xấp xỉ vì cách hiển thị các giá trị. Python chỉ in một xấp xỉ thập phân cho giá trị thập phân thực của xấp xỉ nhị phân được lưu trữ bởi máy. Trên hầu hết các máy, nếu Python in giá trị thập phân thực sự của xấp xỉ nhị phân được lưu trữ cho 0,1, nó sẽ phải hiển thị

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

Đó là nhiều chữ số hơn hầu hết mọi người thấy hữu ích, vì vậy Python giữ cho số chữ số có thể quản lý được bằng cách hiển thị giá trị tròn thay thế

Chỉ cần nhớ, mặc dù kết quả được in trông giống như giá trị chính xác là 1/10, giá trị được lưu trữ thực tế là phần nhị phân có thể đại diện gần nhất.

Thật thú vị, có nhiều số thập phân khác nhau có chung phân số nhị phân gần đúng gần nhất. Ví dụ: các số

0.0001100110011001100110011001100110011001100110011...
8 và
0.0001100110011001100110011001100110011001100110011...
9 và
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
0 đều được xấp xỉ bởi
0.0001100110011001100110011001100110011001100110011...
7. Vì tất cả các giá trị thập phân này có cùng xấp xỉ, bất kỳ một trong số chúng có thể được hiển thị trong khi vẫn bảo tồn
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
2 bất biến.

Trong lịch sử, lời nhắc Python và chức năng

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
3 tích hợp sẽ chọn một hàm có 17 chữ số quan trọng,
0.0001100110011001100110011001100110011001100110011...
9. Bắt đầu với Python 3.1, Python (trên hầu hết các hệ thống) hiện có thể chọn ngắn nhất trong số này và chỉ đơn giản là hiển thị
0.0001100110011001100110011001100110011001100110011...
8.

Lưu ý rằng đây là bản chất của điểm nổi nhị phân: Đây không phải là một lỗi trong Python và nó cũng không phải là một lỗi trong mã của bạn. Bạn sẽ thấy cùng một loại trong tất cả các ngôn ngữ hỗ trợ số học dấu phẩy động phần cứng của bạn (mặc dù một số ngôn ngữ có thể không hiển thị sự khác biệt theo mặc định hoặc trong tất cả các chế độ đầu ra).

Để có đầu ra dễ chịu hơn, bạn có thể muốn sử dụng định dạng chuỗi để tạo ra một số chữ số quan trọng hạn chế:

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'

Điều quan trọng là phải nhận ra rằng, theo một nghĩa thực tế, là một ảo tưởng: Bạn chỉ đơn giản là làm tròn màn hình của giá trị máy thật.

Một ảo ảnh có thể quên đi một ảo ảnh khác. Ví dụ, vì 0,1 không chính xác 1/10, tổng hợp ba giá trị là 0,1 có thể không mang lại chính xác 0,3, cũng vậy:

>>> .1 + .1 + .1 == .3
False

Ngoài ra, vì 0.1 không thể đến gần hơn với giá trị chính xác là 1/10 và 0.3 không thể tiến gần hơn đến giá trị chính xác là 3/10, sau đó hoạt động trước với hàm

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
6 không thể giúp đỡ:

>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False

Mặc dù các số không thể được gần với các giá trị chính xác dự định của chúng, hàm

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
6 có thể hữu ích cho việc sau khi tròn để kết quả với các giá trị không chính xác có thể so sánh với nhau:

>>> round(.1 + .1 + .1, 10) == round(.3, 10)
True

Số học dấu phẩy động nhị phân giữ nhiều bất ngờ như thế này. Vấn đề với các loại 0.1 0,1 được giải thích chi tiết chính xác dưới đây, trong phần Lỗi đại diện trên mạng. Xem những nguy hiểm của điểm nổi để biết một tài khoản đầy đủ hơn về những bất ngờ phổ biến khác.

Như đã nói gần cuối, không có câu trả lời dễ dàng. Tuy nhiên, don không nên cảnh giác quá mức với điểm nổi! Các lỗi trong các hoạt động nổi Python được kế thừa từ phần cứng dấu phẩy động và trên hầu hết các máy theo thứ tự không quá 1 phần trong 2 ** 53 mỗi hoạt động. Điều đó nhiều hơn đủ cho hầu hết các nhiệm vụ, nhưng bạn cần phải nhớ rằng nó không phải là số học thập phân và mọi hoạt động nổi đều có thể bị lỗi làm tròn mới.

Mặc dù các trường hợp bệnh lý tồn tại, nhưng đối với hầu hết các phép số học thông thường của số học dấu phẩy động, bạn sẽ thấy kết quả mà bạn mong đợi cuối cùng nếu bạn chỉ cần hiển thị kết quả cuối cùng của mình với số chữ số thập phân bạn mong đợi.

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
8 thường đủ và để kiểm soát tốt hơn, hãy xem các định dạng định dạng phương thức
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
9 trong cú pháp chuỗi định dạng.Format String Syntax.

Đối với các trường hợp sử dụng yêu cầu biểu diễn thập phân chính xác, hãy thử sử dụng mô-đun

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
0 thực hiện số học thập phân phù hợp cho các ứng dụng kế toán và ứng dụng chính xác cao.

Một dạng khác của số học chính xác được hỗ trợ bởi mô -đun

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
1 thực hiện số học dựa trên các số hợp lý (do đó các số như 1/3 có thể được biểu diễn chính xác).

Nếu bạn là người dùng nặng về các hoạt động nổi, bạn nên xem gói Numpy và nhiều gói khác cho các hoạt động toán học và thống kê do dự án SCIPY cung cấp. Nhìn thấy .

Python cung cấp các công cụ có thể giúp trong những dịp hiếm hoi khi bạn thực sự muốn biết giá trị chính xác của một chiếc phao. Phương pháp

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
2 biểu thị giá trị của một chiếc phao dưới dạng một phần:

>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)

Vì tỷ lệ này là chính xác, nó có thể được sử dụng để tái tạo giá trị ban đầu:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
0

Phương pháp

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
3 thể hiện sự nổi trong thập lục phân (cơ sở 16), một lần nữa đưa ra giá trị chính xác được lưu trữ bởi máy tính của bạn:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
1

Biểu diễn thập lục phân chính xác này có thể được sử dụng để xây dựng lại giá trị nổi chính xác:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
2

Vì biểu diễn là chính xác, nó rất hữu ích cho việc chuyển các giá trị đáng tin cậy trên các phiên bản khác nhau của Python (tính độc lập nền tảng) và trao đổi dữ liệu với các ngôn ngữ khác hỗ trợ cùng định dạng (như Java và C99).

Một công cụ hữu ích khác là chức năng

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
4 giúp giảm thiểu sự chính xác trong quá trình tổng kết. Nó theo dõi các chữ số bị mất của các chữ số vì các giá trị được thêm vào tổng số chạy. Điều đó có thể tạo ra sự khác biệt về độ chính xác tổng thể để các lỗi không tích lũy đến điểm mà chúng ảnh hưởng đến tổng số cuối cùng:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
3

15.1. Lỗi đại diệnRepresentation Error¶

Phần này giải thích chi tiết ví dụ về 0,1 0,1 và cho thấy cách bạn có thể thực hiện phân tích chính xác các trường hợp như thế này. Sự quen thuộc cơ bản với biểu diễn điểm nổi nhị phân được giả định.

Lỗi đại diện đề cập đến thực tế là một số phân số thập phân (hầu hết,) không thể được biểu diễn chính xác dưới dạng phân số nhị phân (cơ sở 2). Đây là lý do chính tại sao Python (hoặc Perl, C, C ++, Java, Fortran và nhiều người khác) thường giành được hiển thị số thập phân chính xác mà bạn mong đợi.

Tại sao vậy? 1/10 không thể đại diện chính xác như một phần nhị phân. Hầu như tất cả các máy ngày nay (tháng 11 năm 2000) sử dụng số học nổi của IEEE-754, và gần như tất cả các nền tảng đều lập bản đồ python nổi lên IEEE-754. 754 nhân đôi chứa 53 bit độ chính xác, vì vậy, trên đầu vào, máy tính cố gắng chuyển đổi 0,1 thành phân số gần nhất mà nó có thể của Mẫu J/2 ** n trong đó J là một số nguyên chứa chính xác 53 bit. Viết lại

như

và nhớ lại rằng J có chính xác 53 bit (là

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
5 nhưng
>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
6), giá trị tốt nhất cho N là 56:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
4

Đó là, 56 là giá trị duy nhất cho n để lại J với chính xác 53 bit. Giá trị tốt nhất có thể cho J sau đó là công cụ làm tròn:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
5

Vì phần còn lại là hơn một nửa của 10, nên phép tính gần đúng tốt nhất có được bằng cách làm tròn lên:

Do đó, xấp xỉ tốt nhất có thể với 1/10 trong 754 độ chính xác kép là:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
6

Chia cả tử số và mẫu số cho hai phần giảm phân số thành:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
7

Lưu ý rằng vì chúng tôi đã làm tròn, điều này thực sự lớn hơn một chút so với 1/10; Nếu chúng tôi không làm tròn, thương số sẽ nhỏ hơn một chút so với 1/10. Nhưng trong mọi trường hợp, nó có thể chính xác là 1/10!

Vì vậy, máy tính không bao giờ nhìn thấy 1/10: những gì nó thấy là phần chính xác được đưa ra ở trên, xấp xỉ kép tốt nhất 754 mà nó có thể nhận được:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
8

Nếu chúng ta nhân phân số đó với 10 ** 55, chúng ta có thể thấy giá trị ra thành 55 chữ số thập phân:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
9

Có nghĩa là số chính xác được lưu trữ trong máy tính bằng với giá trị thập phân 0.100000000000000000055511151231257827021181583404541015625. Thay vì hiển thị giá trị thập phân đầy đủ, nhiều ngôn ngữ (bao gồm các phiên bản cũ của Python), kết quả tròn đến 17 chữ số quan trọng:

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
0

Các mô -đun

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
1 và
>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
0 giúp các tính toán này dễ dàng:

import random
from decimal import Decimal
for _ in range(1000000):
    x = random.random()
    assert x == float(repr(x)) == float(Decimal(repr(x)))  # Reversible repr()
    assert str(x) == repr(x)
    assert len(repr(round(x, 12))) <= 14         # no excessive decimal places.
1

Làm thế nào để bạn gán một điểm nổi trong Python?

Phương thức float () là hàm python tích hợp được sử dụng để chuyển đổi số nguyên hoặc chuỗi thành giá trị dấu phẩy động.Phương thức float () có trong một tham số: giá trị bạn muốn chuyển đổi thành một float.Tham số này là tùy chọn và giá trị mặc định của nó là 0,0. is a built-in Python function that is used to convert an integer or a string to a floating-point value. The float() method takes in one parameter: the value you want to convert to a float. This parameter is optional and its default value is 0.0.

Làm cách nào để sửa chữa các vị trí thập phân nổi trong Python?

Trunc (): Hàm này được sử dụng để loại bỏ tất cả các phần thập phân của số điểm nổi và trả về số nguyên mà không có phần thập phân. This function is used to eliminate all decimal parts of the floating-point number and return the integer without the decimal part.