当前位置: 首页 > 后端技术 > Python

fractions--分数

时间:2023-03-25 22:25:19 Python

初步提示:在测试代码中,右尖括号(>)表示命令行中的命令输入;输出内容是以井号(#)开头的单行;库的导入仅在本文第一个测试代码所示,其他代码块省略了库的导入代码。系统类型:Windows10python版本:Python3.9.0fractions模块支持小数运算。要使用分数模块,您需要先实例化分数类。实例化的分数类可以由各种类型的参数构造。分数类。分数(字符串)类分数。分数(小数)类分数。分数(浮点数)类分数。分数(其他分数)类分数。分数(分子=0,denominator=1)直接上栗子:importfractionsimportdecimalimportmath'''传入一个字符串'''obj1=fractions.Fraction('2.1')??print(obj1)#21/10'''传入一个小数类型浮点数'''obj2=fractions.Fraction(decimal.Decimal('2.1')??)print(obj2)#21/10'''传入一个浮点数'''obj3=fractions.Fraction(2.1)print(obj3)#4728779608739021/2251799813685248'''传入另一个Fraction实例化对象'''obj4=fractions.Fraction(obj3)print(obj4)#4728779608739021/22516959813'pass'分别输入分子,分母'''obj5=fractionsFraction(210,100)print(obj5)#21/10通过上面的例子可以清楚的知道Fraction实例化的时候可以传递哪些参数,但是类fract离子.分数(分子=0,denominator=1)这个实例化方法需要稍微解释一下。根据文档,分子和分母是numbers.Rational的实例,那么numbers.Rational是什么?numerator表示分子,denominator表示分母,而在python3.9版本之后,这两个参数只能传递int类型的数据,所以其实可以理解为传递两个int类型的参数。obj=fractions.Fraction(2.2,100)print(obj)#Traceback(最近调用last):#File"e:\project\test\test.py",line3,in#obj=fractions.Fraction(2.2,100)#文件“C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\fractions.py”,第152行,在__new__#raiseTypeError("bothargumentsshouldbe"#TypeError:bothargumentsshouldbeRationalinstancesFractioninstantiatedobjectsarehashable,andItshouldbetreatedasanimmutableobject.obj=fractions.Fraction(210,100)print(hash(obj))#2075258708292324558上面例子中的实例化对象obj4是传入obj3的实例化对象后得到的,那么它们的id是否相同?obj3=fractions.Fraction(2.1)obj4=fractions.Fraction(obj3)print(id(obj3))#2774800535456print(id(obj4))#2774800535264通过测试可以看出它们是相互独立的,互不影响as_integer_ratio()得到由分子和分位数组成的元组数据参数nator:无返回值:tuple,(numerator,denominator)在实例化Fraction时,实例化对象中的分子和分母已经自动变为最简单的分数形式,如果分母为负数,则变为分子。这个函数的作用只有Obj=fractions.Fraction(2,-100)print(obj)#已经是最简单的分数形式了#-1/50print(obj.as_integer_ratio())#(-1,50)from_float(flt)生成一个Fraction实例化对象,表示参数flt??的确切值。参数:flt:浮点数返回值:facations实例化对象传入浮点数类型的参数,可以生成一个Fraction实例化对象,this对象表示的值就是这个浮点数的准确值number.'''使用方法一:在一个实例化对象中使用,会生成另一个实例化对象,不会影响旧的实例化对象'''obj=fractions.Fraction(2,-100)print(obj)#-1/50obj2=obj.from_float(0.1)print(obj)#-1/50print(obj2)#2879701896397/36028797018963968'''方法二:直接使用'''obj3=fractions.Fraction.from_float(0.1)打印(obj3)#3602879701896397/36028797018963968为什么0.1产生的分子和分母的数那么大?一切都从浮点数用二进制存储的机制说起,emmmmmmm……不打算详细解释,有兴趣的可以百度一下。总之,一些特殊的浮点数可以用二进制正常存储,但是上面例子中的浮点数只能存储到一个有限的近似值。例如:obj=分数。Fraction.from_float(0.125)print(obj)#1/8from_decimal(dec)生成一个Fraction实例化对象,表示参数flt的精确值。参数:dec:decimal.Decimal实例化对象返回值:facings实例化对象from_float()函数类似,不同的是这个函数的参数必须是decimal.Decimal的实例化对象(其实是更精确的float类型的对象)'''使用方法一:在一个实例化对象中使用,另一个实例会生成实例化对象,不会影响旧的实例化对象'''obj=fractions.Fraction(2,-100)print(obj)#-1/50obj2=obj.from_decimal(decimal.Decimal(0.1))print(obj)#-1/50print(obj2)#3602879701896397/36028797018963968'''方法二:直接使用'''obj3=fractions.Fraction.from_decimal(decimal.Decimal(0.1))print(obj3)#3602879701896397/36028797018963968limit_denominator(max_denominator=1000000)控制分母的最大值参数:max_denominator:int,分母的最大值,默认为1000000返回值:facings的实例化对象,用在Fraction的实例化对象上,新建一个可以获得Fraction的实例化对象。obj3=fractions.Fraction.from_decimal(decimal.Decimal(0.11))print(obj3)#7926335344172073/72057594037927936obj4=obj3.limit_denominator()print(obj4)#11/100print(type(obj4))#魔法方法facations模块也内置了一些魔法方法,让那些指定的函数可以接收Fraction实例化对象参数。__floor__(),math.floor()函数使用,返回整数部分__ceil__(),通过math.ceil()函数使用,四舍五入为整数obj1=fractions.Fraction(0.11)obj2=fractions.Fraction(0.61)'''未处理'''print(obj1)#7926335344172073/72057594037927936print(obj2)#5494391545392005/90071992547'printdecimalpart'''floor(obj1))#0print(math.floor(obj2)'进入一舍入'''print(math.ceil(obj1))#1print(math.ceil(obj2))#1'''舍入'''print(round(obj1))#0print(round(obj2))#1公众号:《python杂货店》,专注于python语言及相关知识。发现更多原创文章,期待您的关注。参考考试源码:lib/fractions.py官方文档:https://docs.python.org/zh-cn...