Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,您是否可以将非终止浮点(分数)转换为字符串,而无需链接其状态?_Python_Math_Floating Point_Integer_Fractions - Fatal编程技术网

在Python中,您是否可以将非终止浮点(分数)转换为字符串,而无需链接其状态?

在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最接近的分数 最大分母。这种方法有助于

有什么方法可以使非终止浮点(非终止分数)成为字符串,同时保留其格式(无小数,即1.66666 7)?例如,我希望7/6成为“7/6”。假设非终止浮点为未知,且代码应与任何数字一起工作。您可以导入,但不能创建新文件。我尝试过多次,但我只能使用文件解决这个问题。 我们将这样开始→
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)