Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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_Rounding_Fractions - Fatal编程技术网

仅当重复python时,四舍五入到小数点后两位

仅当重复python时,四舍五入到小数点后两位,python,rounding,fractions,Python,Rounding,Fractions,我想知道是否有人知道python中的一种快速方法来检查分数是否给出重复的小数 我有一个小函数,它接受两个数字并将它们分开。如果商是重复的小数,我想四舍五入到小数点后2位,如果商不是重复的,我只想四舍五入到1位 例如: 800/600=1.33333,等于1.33 900/600=1.5将保持为1.5 我知道我需要使用这两种语句进行两种舍入 output = "{:.2f}".format(float(num)) output = "{:,}".format(float(num)) 但是我对if

我想知道是否有人知道python中的一种快速方法来检查分数是否给出重复的小数

我有一个小函数,它接受两个数字并将它们分开。如果商是重复的小数,我想四舍五入到小数点后2位,如果商不是重复的,我只想四舍五入到1位

例如:

800/600=1.33333,等于1.33

900/600=1.5将保持为1.5

我知道我需要使用这两种语句进行两种舍入

output = "{:.2f}".format(float(num))
output = "{:,}".format(float(num))
但是我对if语句的指向有困难

有人能帮我了解一下吗

重复小数

只有10个分数可以写成重复的数字-
(0)
(1)
<代码>(9)。所以,若您只关心从小数点后开始的重复模式,那个么只需要对照这些情况进行检查

如果乘以9,所有这些数字(只有它们)都会给出一个整数

因此,如果
(9*numenator)%denominator==0
,您将打印两位数字

不过,您可能希望排除
(0)
模式。为此,请测试分数实际上是否为整数-
numenator%分母==0

此外,还可以查看模块,以防您需要重新设计一些轮子

当然,如果您的数字只有一个
浮点数
,那么什么是numenator和分母就有一些模糊性,因为
浮点数
s实际上并不存储像
1/3
这样的有理数。您可以尝试使用
分数
。限制分母()
来选择适合您情况的东西。

使用模块,该模块实现精确的有理运算:

import fractions

# fractions.Fraction instances are automatically put in lowest terms.
ratio = fractions.Fraction(numerator, denominator)
然后,您可以检查结果的分母

def is_repeating(fraction):
    denom = fraction.denominator
    while not (denom % 2):
        denom //= 2
    while not (denom % 5):
        denom //= 5
    return denom != 1

试试这个:用蛮力就行了。因为你只需要2位小数。只需将其除以,然后在四舍五入到0和小数点后1位时对其进行测试,看看它在哪里不再唯一。如果此时它不是唯一的,则四舍五入到小数点后2位

def f(x):
    if x == round(x,0):
        return '{:.0f}'.format(x)
    elif x == round(x,1):
        return '{:.1f}'.format(x)
    else:
        return round(x,2)

y = [1, 2, 3, 3/2, 1/9, 8/9, 1/11, 12/11, 10/11, 14/13, 1/3]
for item in y:
    print(f(item))
输出:

1
2
3
1.5
0.11
0.89
0.09
1.09
0.91
1.08
0.33
>>> 
1.33

只是一个使用regex的变通方法:)

输出:

1
2
3
1.5
0.11
0.89
0.09
1.09
0.91
1.08
0.33
>>> 
1.33
对于
900/600

1.5

所有分数都可以用重复的小数来写。像你在学校做的那样进行分组,并检查是否有立即重复的模式。你想用1/1打印什么?还是5/4?啊,对不起,这可能是个愚蠢的问题。对于1/1,我想显示1,对于5/4,我将显示1.25。我的目标是不显示任何尾随的0,您希望10/99的值是多少,即0.101010…?我希望看到10/99=0.10“重复小数”包括像1/7和10/99这样的数字。重复部分不必是单个数字。这意味着将
900/600
打印为
1.50
,而OP的示例中并非如此。900/600终止。它确实有一个重复的小数点-0,这是问题中的区别。但是,任何分数都有一个,但没有任何分数部分具有仅由此模式组成的十进制表示<代码>1.5(0)
有其“5”,因此被截断。您完全误解了“重复小数”一词的含义,也许更重要的是,您对该词的使用与提问者的意图不符。例如,提问者希望10/99的
0.10
,其重复部分有两位数长。