首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将fractions.Fraction转换为decimal.Decimal的最佳方法?

将fractions.Fraction转换为decimal.Decimal的最佳方法?
EN

Stack Overflow用户
提问于 2016-11-07 15:23:25
回答 1查看 3.6K关注 0票数 16

在Python中,存在fractions.Fractiondecimal.Decimal标准库类,以帮助保持有理数精确的算术。对于不熟悉的人,举个例子说明它在哪里有帮助:

代码语言:javascript
复制
>>> 1 / 10 * 3
0.30000000000000004
>>> decimal.Decimal('1') / 10 * 3
Decimal('0.3')
>>> fractions.Fraction('1') / 10 * 3
Fraction(3, 10)

我的问题是,如果我有一个Fraction,那么将其转换为Decimal的最佳方法是什么?

不幸的是,显而易见的解决方案不起作用:

代码语言:javascript
复制
>>> decimal.Decimal(fractions.Fraction(3, 10))
Traceback (most recent call last):
  ...
TypeError: conversion from Fraction to Decimal is not supported

现在我正在使用以下代码:

代码语言:javascript
复制
>>> decimal.Decimal(float(fractions.Fraction(3, 10)))
Decimal('0.299999999999999988897769753748434595763683319091796875')

现在,当我实际输出这个值时,任意数量的四舍五入都会将它转换为0.3,而且我只在输出之前进行这个转换(所有核心数学都是用Fraction完成的)。不过,在我看来,我无法从一个Decimal('0.3')中获得一个Fraction(3, 10),这似乎有点愚蠢。任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 15:31:51

把分数的除法留给Decimal()自己怎么样?

代码语言:javascript
复制
def decimal_from_fraction(frac):
    return frac.numerator / decimal.Decimal(frac.denominator)

这就是Fraction.__float__()所做的事情(只需将分子除以分母),但是通过将这两个值中的至少一个转化为Decimal对象,您就可以控制输出。

这允许您使用decimal上下文:

代码语言:javascript
复制
>>> 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')
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40468697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档