2016-11-07 69 views
8

在Python中,存在fractions.Fractiondecimal.Decimal標準庫類,以幫助精確計算有理數。對於不熟悉的,在哪裏它有助於例如:將fractions.Fraction轉換爲decimal.Decimal的最佳方法?

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

我的問題是,如果我有一個Fraction,什麼是將其轉換爲一個Decimal的最佳方式?

不幸的是,明顯的解決方案不起作用:

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

現在,我使用此代碼:

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

現在,當我真正輸出這個值,四捨五入意志的任何量將其轉換爲0.3,並且我只在輸出之前立即執行此轉換(所有核心數學都通過Fraction完成)。儘管如此,我似乎有點傻,我無法從Fraction(3, 10)獲得Decimal('0.3')。任何幫助,將不勝感激!

+1

「在Python中,'fractions.Fraction'和'decimal.Decimal'標準庫中的類存在,以幫助保持算術精確有理數。」不完全的。 'Decimal.decimal'仍然是浮點數,它只是基數爲10的浮點數。 '小數(1)/小數(3)'不能給出準確的答案。 –

回答

11

如何將分數除以Decimal()本身?

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

這是Fraction.__float__()沒有(簡單地除以分母分子),而是通過轉動兩個值中的至少一個爲Decimal對象你會得到控制輸出。

這可讓您使用decimal背景:

>>> 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

太棒了!這是完美的,非常感謝! –

+3

是否有一個原因,其他方式的轉換是由類方法from_decimal支持的? 'frac = fractions.Fraction.from_decimal(decimal.Decimal('0.3'))'是有效的,但'Decimal'沒有'from_fraction'方法。 – roganjosh

+0

@roganjosh:沒有標準的鉤子來轉換值是另一個方向,而float()(以'__float__'的形式)。您可以使用該項目提交功能請求。 –

相關問題