在Python中,您是否可以将非终止浮点(分数)转换为字符串,而无需链接其状态?
有什么方法可以使非终止浮点(非终止分数)成为字符串,同时保留其格式(无小数,即1.66666 7)?例如,我希望7/6成为“7/6”。假设非终止浮点为未知,且代码应与任何数字一起工作。您可以导入,但不能创建新文件。我尝试过多次,但我只能使用文件解决这个问题。 我们将这样开始→在Python中,您是否可以将非终止浮点(分数)转换为字符串,而无需链接其状态?,python,math,floating-point,integer,fractions,Python,Math,Floating Point,Integer,Fractions,有什么方法可以使非终止浮点(非终止分数)成为字符串,同时保留其格式(无小数,即1.66666 7)?例如,我希望7/6成为“7/6”。假设非终止浮点为未知,且代码应与任何数字一起工作。您可以导入,但不能创建新文件。我尝试过多次,但我只能使用文件解决这个问题。 我们将这样开始→ a=7/6您可以使用内置类: 从分数导入分数 f=分数(7,6) 答案 如所述,您可以使用该模块 特别是看看它的limit\u deminator()方法 查找并返回分母为的与self最接近的分数 最大分母。这种方法有助于
a=7/6
您可以使用内置类:
从分数导入分数
f=分数(7,6)
答案
如所述,您可以使用该模块
特别是看看它的limit\u deminator()
方法
查找并返回分母为的与self最接近的分数
最大分母。这种方法有助于寻找有理数
给定浮点数的近似值
例如,在您的案例中:
from fractions import Fraction
a = 7/6.
print(Fraction(a).limit_denominator(max_denominator=100000))
7/6
来源:以及: 编辑 如果您的数字在小数点后有很多位,您可以考虑将其四舍五入,例如:
from math import log10
from fractions import Fraction
a = 7/6.
rounding_factor = 100000
a = round(a, int(log10(rounding_factor)))
print(Fraction(a).limit_denominator(max_denominator=int(rounding_factor/10)))
7/6
如果将其转换为函数,它可能如下所示(尝试使用它):
通知
当然,此函数适用的数字范围取决于两个输入。您可能对函数感兴趣。Mpmath是Python的多精度库
identify()
适用于分数、平方根、对数、指数以及一些数学常数和它们的线性组合
正如其他人所指出的,这个过程非常精确。您可能需要对您的确切用例进行实验
请注意,通常要表示为分数的数字是某些计算的结果,并累积舍入误差。为了处理这些错误,identify()
可以将容差作为参数
例如:
从mpmath导入mp
打印(mp.identify(mp.phi))#-->((1+sqrt(5))/2)
打印(mp.标识(1.666667,tol=1e-6))#-->(5/3)
将浮点数转换为分数的数学方法非常简单。计算A直到达到某个公差,然后将其连续分数重写为正常分数。开始的数字是多少?字面上类似于
a=7/6
,那么a
是float
?关于文件的限制是什么?是的,你是对的,就像a=7/6。创建一个新文件效率不高,也不是一个很好的解决方案,所以我排除了。我不确定创建一个新文件在任何方面都是相关的…无论如何,你的浮动不包含信息“7/6”,它只是1.66666 7
。可以是14/12
,或者任何其他数字。您需要使用不同于浮点的数据类型来“保留格式”。是的,对不起,我更改了标题。不同的数据类型是什么意思?欢迎使用。你不能简单地打印str(“7/6”)
?我想这里的问题更多的是检测这种“非理性”的情况,这可能不像你在计算机中处理二进制表示那么简单。。。看一看。嗨,穆雷尼克,谢谢你的回答。不幸的是,这不是我想要的。我们不能假设用户给出的数字。分数(7/6)不起作用,但分数(“7/6”)起作用。我们正在尝试将一个非终止分数转换成一个字符串,同时保留其格式。嗨,s.k谢谢你的回答。我们假设非终止分数未知。因此,可能有一个分数超过100000。@Sonav:那么不,没有办法做你想做的事。当您将分数表示为浮点数时,您已经丢失了信息。例如,102334155/165580141
和39088169/63245986
在一台典型机器上给出完全相同的浮点值,但它们并不等同于分数。如果它超过了max_分母
,您可以通过将输入的浮点值剪切为固定的位数来调整函数(请参见编辑),假设1.66666 7
等于1.66666 7
。这当然有其局限性。
def transform_decimal_to_fraction(a, rounding_factor=100000):
"""Return a string representing the input number a as a fraction.
Parameters:
----------
a : float
The variable on which to perform the transformation to a fraction string.
rounding_factor : int
The rounding factor to use. This factor is transforme to its log10 to
cut the input variable a to a limited number of digits after the decimal
point. It is also used, dived by 10 to adapt to the latter, as the
max_denominator used by Fraction.
Default value = 100000.
Returns:
-------
retval : str
A string representing the input variable as a fraction.
"""
from math import log10
from fractions import Fraction
a = round(a, int(log10(rounding_factor)))
b = (Fraction(a).limit_denominator(max_denominator=int(rounding_factor/10)))
retval = str(b)
return(retval)