python除法运算的一点讨论,大神指点一个问题没有解决。谢谢。。
python吧
全部回复
仅看楼主
level 3
rosepass 楼主
关于
>>>10%-3
-2
理解:10/-3=-3.3333333
整除后向下圆整
10//-3=-4
求余10-(-3)*(-4)=-2
>>>-10%3
2
理解:-10/3=-3.3333333
整除后向下圆整
-10//3=-4
求余(-10)-3*(-4)=2
老是对这个python求除法如6/9=0.6666666666666666 10/3=3.3333333333333335等不正确感到无法理解,然后发现不是只有python这样,其余的语言如java等也是这样,使用时只要在限定位数里面下个限定就好了。。。
>>> round(6/9,15)
0.666666666666667
>>> round(10/3,15)
3.333333333333333
当然前提是小数后面要小于16位,如果不小于16位超过了精度还是一样的结果,与语言无关,是cpu的运算底层的问题。
那如果非要得到不小于16位以上的正确小数结果呢?那只能通过一个流程来处理了。。。
# -*-coding: utf-8-*-
while 1:
try:
a,b = eval(input("请输入2个整数,用英文半角逗号隔开:"))
if b == 0:
raise Exception
n= int(input("请输入要达到的小数位数:"))
break
except:
print("输入错误,除数不能为0或者逗号为中文全角逗号,请重新输入")
#2,计算商和余数
s= a//b#取商的整数部分
r = a%b
#取余数
print("经过计算,商是:",s,"余数是:",r)
#3,如果有余数,则继续计算得到指定的小数位数为止
if r == 0:
print("{}除以{}能够整除,结果为{},无小数位数。".format(a,b,s))
else:#如果有余数则继续计算
xs = str(s)+"."#先设置小数的整数部分及小数点
xs1 = ""#初始化小数位
#4,设置循环条件为小数位数不足指定位少一位数
while len(xs1)<(n-1):
r = r*10#余数增大10倍,再除以b
xs2 = r//b
xs1 = xs1 + str(xs2)#得到的整数部分写入小数位置
r = r%b#继续取余数
#5,处理最后一位小数4舍5入
while len(xs1)<(n+1):
r = r*10#余数增大10倍,再除以b
xs4 = r//b
xs3 = xs1 + str(xs4)#得到的整数部分写入小数位置
r = r%b#继续取余数
xs5 = xs3[n:1]
xs6 = xs3[(n+1):1]
xs6 = int(xs6)
if xs6<5:
xs5 = xs5
else:
xs5 = xs5 + 1
xs1 = xs1+str(xs5)
#6,输出结果
print("python直接计算%d除以%d的值为:%s" %(a,b,a/b))
print("指定保留%d位小数的值为:%s"%(n,(xs+xs1)))
内容都是百度的,最后的那个第5步是我自己加的,没有提示语法不对,不知道是什么原因算不出来,把第五步去掉就正常,但是最后一位没有四舍五入。。。。
2020年01月29日 06点01分 1
level 3
rosepass 楼主
第五步切片错误,处理后还是不对。。。
#5,处理最后一位小数4舍5入
while len(xs1)<(n+1):
r = r*10#余数增大10倍,再除以b
xs4 = r//b
xs3 = xs1 + str(xs4)#得到的整数部分写入小数位置
r = r%b#继续取余数
xs5 = xs3[(n-1):n]
xs6 = xs3[n:(n+1)]
xs6 = int(xs6)
if xs6<5:
xs5 = xs5
else:
xs5 = xs5 + 1
xs1 = xs1+str(xs5)
2020年01月29日 06点01分 2
level 6
既然是python,怎么能少了decimal呢
In [1]: from decimal import *
In [2]: getcontext().prec=30
In [3]: Decimal(10)/Decimal(3)
Out[3]: Decimal('3.33333333333333333333333333333')
In [4]: Decimal(6)/Decimal(9)
Out[4]: Decimal('0.666666666666666666666666666667')
In [5]: Decimal(2).sqrt()
Out[5]: Decimal('1.4142
13562373095
04880168872421')
2020年01月29日 09点01分 3
大佬 。in out那些玩意儿是怎么用手机弄出来的。不会是用手一个个打出来的吧。。。。
2020年01月30日 01点01分
@rosepass ipython
2020年01月31日 03点01分
level 3
rosepass 楼主
完美的解决了我的问题。。。可是我写的那几行到底是哪里有问题?我觉得应该是赋值错误。慢慢学吧。。。谢谢。。。。
2020年01月30日 01点01分 4
level 3
rosepass 楼主
终于弄出来了。。。还是我的赋值的问题,多加了一行赋值解决了。。。应该是xs1多次引用造成的。。。
解决问题的方法很多,实现自己的想法的操作方法不一定是最好的,但是自己能实践一下也是一个解决问题的过程。。。。我的代码打得少,都是扒下来的,以后还是自己多打代码。。。说要是自己打出来的有效代码能有个5万行就能入门了。我自己打出来的代码不知道有没有100行,还全是那些print('Hello world!')无意义的代码。。。
谨此记录小白流程。。。
2020年01月30日 04点01分 5
1