我想知道是否有人知道python中的快速方法来检查并查看分数是否给出了重复的小数。
我有一个小函数,它接收两个数字并将它们分开。如果商是重复小数,我想舍入到2位小数,如果商不重复,我想舍入到只有一个
示例:
800/600 = 1.33333333333333,等于1.33
900/600 = 1.5将保持为1.5
我知道我需要将这两种语句用于两种类型的舍入
output = "{:.2f}".format(float(num))
output = "{:,}".format(float(num))
但我在使用if语句遇到一个或另一个时遇到了问题。
任何人都可以提供一些见解吗?
答案 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()
来选择适合您案例的内容。