仅在重复python

时间:2016-07-07 17:37:00

标签: python rounding fractions

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

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

示例:

800/600 = 1.33333333333333,等于1.33

900/600 = 1.5将保持为1.5

我知道我需要将这两种语句用于两种类型的舍入

output = "{:.2f}".format(float(num))
output = "{:,}".format(float(num))

但我在使用if语句遇到一个或另一个时遇到了问题。

任何人都可以提供一些见解吗?

4 个答案:

答案 0 :(得分:1)

使用fractions模块,它实现了精确的有理算术:

import fractions

# fractions.Fraction instances are automatically put in lowest terms.
ratio = fractions.Fraction(numerator, denominator)

然后,您可以检查结果的denominator

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

答案 1 :(得分:0)

试试这个:只需使用蛮力。因为你只需要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
>>> 

答案 2 :(得分:0)

使用正则表达式解决方法:)

import re

result = str(800/600)
# result = str(900/600)

repeating_pair = re.escape(result.split('.')[1][:2])
check_within = result.split('.')[1][2:]

if re.match(repeating_pair, check_within):
    print("{:.2f}".format(float(result)))
else:
    print("{:.1f}".format(float(result)))

输出:

1.33

适用于900/600

1.5

答案 3 :(得分:-1)

  

重复小数

只有10个分数可以写成重复的数字 - .(0).(1),... .(9)。因此,如果您只关心在小数点后重复开始模式,您只需要检查这些情况。

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

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

您可能希望排除.(0)模式。为此,请测试您的分数是否实际上是一个整数 - numenator % denominator == 0

同时检查fractions模块,以防你有一些轮子重新发明。

当然,如果您只将您的号码作为float,那么关于什么是numenator和分母有一些含糊不清,因为float实际上并不存储像{{1/3这样的有理数。 1}}。您可以试用fractions .limit_denominator()来选择适合您案例的内容。