2012-09-06 35 views
6

Sau khi nhậpTại sao hàm thập phân của Python mặc định là 54 vị trí?

from decimal import * 
getcontext().prec = 6 
Decimal (1)/Decimal (7) 

tôi nhận được giá trị

Decimal('0.142857') 

Tuy nhiên nếu tôi nhập Decimal (1.0/7) tôi nhận được

Decimal('0.142857142857142849212692681248881854116916656494140625') 
+2

Lưu ý rằng chỉ chính xác cho '0.1428571428571428' các chữ số còn lại là không đúng –

Trả lời

12

Các 1,0/7 tính một số dấu chấm động nhị phân đến 17 chữ số độ chính xác. Điều này xảy ra trước khi các Decimal constructor nhìn thấy nó:

>>> d = 1.0/7 
>>> type(d) 
<type 'float'> 
>>> d.as_integer_ratio() 
(2573485501354569, 18014398509481984) 

Các phần nhị phân, 2573485501354569/18014398509481984 là càng gần càng dấu chấm động nhị phân có thể có được sử dụng 53 bit chính xác. Nó không phải là chính xác 1/7, nhưng nó khá gần.

Trình xây dựng thập phân sau đó chuyển đổi phần nhị phân thành nhiều vị trí cần thiết để có được số thập phân chính xác tương đương. Kết quả bạn đang nhìn thấy là những gì bạn nhận được khi bạn đánh giá 2573485501354569/18014398509481984 chính xác:

>>> from decimal import Decimal, getcontext 
>>> getcontext().prec = 100 
>>> Decimal(2573485501354569)/Decimal(18014398509481984) 
Decimal('0.142857142857142849212692681248881854116916656494140625') 

Learning điểm 1: dấu chấm động nhị phân tính phân số nhị phân 53 bit chính xác. Kết quả được làm tròn nếu cần.

Điểm học tập 2: Nhà xây dựng Decimal chuyển đổi số dấu phẩy động nhị phân thành số thập phân không mất (không làm tròn). Điều này có xu hướng dẫn đến nhiều chữ số chính xác hơn bạn mong đợi (Xem câu hỏi thứ 6 trong số Decimal FAQ).

Điểm học tập 3: Mô-đun thập phân được thiết kế để xử lý tất cả các số là chính xác. Chỉ các kết quả tính toán mới được làm tròn đến độ chính xác của ngữ cảnh. Đầu vào dấu chấm động nhị phân được chuyển đổi thành thập phân chính xác và độ chính xác ngữ cảnh không được áp dụng cho đến khi bạn tính toán với số (Xem câu hỏi và câu trả lời cuối cùng trong Câu hỏi thường gặp để biết chi tiết).

Tóm tắt điều hành: Không thực hiện phân chia điểm nổi nhị phân trước khi chuyển số sang mô-đun thập phân. Hãy để nó làm công việc đến độ chính xác mong muốn của bạn.

Hope this helps :-)

+0

Great câu trả lời, tốt bạn đã trả lời câu hỏi này. Tôi đang xóa của tôi, vì nó trông khốn khổ bây giờ;) +1 – Tadeck

Các vấn đề liên quan