2016-11-07 27 views
8

Trong Python, các lớp thư viện chuẩn fractions.Fractiondecimal.Decimal tiêu chuẩn tồn tại để giúp giữ số học với số hữu tỷ một cách chính xác. Đối với không quen thuộc, một ví dụ về nơi nó giúp:Cách tốt nhất để chuyển đổi phân số.Fraction thành decimal.Decimal?

>>> 1/10 * 3 
0.30000000000000004 
>>> decimal.Decimal('1')/10 * 3 
Decimal('0.3') 
>>> fractions.Fraction('1')/10 * 3 
Fraction(3, 10) 

Câu hỏi của tôi là, nếu tôi có một Fraction, cách tốt nhất để chuyển đổi nó vào một Decimal là gì?

Thật không may là giải pháp rõ ràng không hoạt động:

>>> decimal.Decimal(fractions.Fraction(3, 10)) 
Traceback (most recent call last): 
    ... 
TypeError: conversion from Fraction to Decimal is not supported 

Ngay bây giờ tôi đang sử dụng mã này:

>>> decimal.Decimal(float(fractions.Fraction(3, 10))) 
Decimal('0.299999999999999988897769753748434595763683319091796875') 

Bây giờ, khi tôi thực ra giá trị này, bất kỳ số tiền làm tròn chí chuyển đổi nó thành 0,3 và tôi chỉ thực hiện chuyển đổi này ngay trước khi xuất (tất cả các phép tính cốt lõi được thực hiện với Fraction). Tuy nhiên, có vẻ hơi ngớ ngẩn với tôi rằng tôi không thể nhận được số Decimal('0.3') từ số Fraction(3, 10). Bất kỳ trợ giúp sẽ được đánh giá cao!

+1

Không hẳn. 'Decimal.decimal' vẫn là dấu chấm động, nó chỉ là dấu phảy động cơ bản-10. 'Thập phân (1)/Thập phân (3)' không thể đưa ra câu trả lời chính xác. –

Trả lời

11

Làm cách nào để tách phân số đó thành Decimal()?

def decimal_from_fraction(frac): 
    return frac.numerator/decimal.Decimal(frac.denominator) 

Đây là những gì Fraction.__float__() không (chỉ đơn giản là chia tử số bằng mẫu số), nhưng bằng cách chuyển ít nhất một trong hai giá trị vào một đối tượng Decimal bạn có thể kiểm soát đầu ra.

này cho phép bạn sử dụng decimal bối cảnh: "Trong Python, 'cái fractions.Fraction` và' decimal.Decimal` lớp thư viện tiêu chuẩn tồn tại để giúp giữ cho số học với số lượng hợp lý chính xác"

>>> decimal_from_fraction(fractions.Fraction(3, 10)) 
Decimal('0.3') 
>>> decimal_from_fraction(fractions.Fraction(1, 55)) 
Decimal('0.01818181818181818181818181818') 
>>> with decimal.localcontext() as ctx: 
... ctx.prec = 4 
... decimal_from_fraction(fractions.Fraction(1, 55)) 
... 
Decimal('0.01818') 
+0

Tuyệt vời !! Điều này là hoàn hảo, cảm ơn rất nhiều !! –

+3

Có lý do nào để chuyển đổi theo cách khác được hỗ trợ bởi một phương thức lớp 'from_decimal'? 'frac = fractions.Fraction.from_decimal (decimal.Decimal ('0.3'))' là hợp lệ, nhưng không có phương thức 'from_fraction' cho' Decimal'. – roganjosh

+0

@roganjosh: không có móc tiêu chuẩn nào để chuyển đổi các giá trị là hướng khác, trong khi có 'float()' (dưới dạng '__float__'). Bạn có thể gửi yêu cầu tính năng với dự án. –

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