Python如何将17.955四舍五入保留两位小数?(直接用round结果不对)
你round(17.955)的时候其实有两步操作
第一个 是把 十进位下 你的input 17.955 转化成 Float第二个 是把这个Float 对象传递给 round 函数问题在于第一步
17.955实际上在计算机的存储中是17.954999999999...
一些十进位的小数,转换成二进位的时候就是无限循环小数了。精度就丢失了。你round(17.955,2) 第三个有效数字是4,自然就是舍去了。
实话实说,你并没有很好的简约方法来真实的表达17.955
print的format和round一样靠不住最保证正确但很笨的方法应该是在存储的时候保存为int比如 例子的17.955
应该保存为 17955 和 小数部分长度 3你要保留2位有效数字就是 取决于最后一位, 所以要除以 10
对 17955 除以 10 得到 商 1795 和 余数 5
余数 5 大等于 5, 所以商要加1(1795+1)*10 就还原成想要的int了 然后再除以 1000 就得到想要的 float了这其实是在用二进位模拟十进位的演算法round(17.955 + 0.001, 2)其它数字都可以使用这个方法。
用decimal模块就可以现实,代码如下
&>&>&> decimal.getcontext().rounding=decimal.ROUND_HALF_UP&>&>&> b=decimal.Decimal(37.045,decimal.getcontext())&>&>&> b.__round__(2)Decimal(37.05)
&>&>&> b.__round__(3)Decimal(37.045)&>&>&> b.__round__(2)Decimal(37.05)&>&>&> b.__round__(1)Decimal(37.0)&>&>&> b=decimal.Decimal(37.065,decimal.getcontext())&>&>&> b.__round__(2)Decimal(37.07)&>&>&> b.__round__(1)
Decimal(37.1)转自:https://www.tr0y.wang/2019/04/08/Python%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5/index.html
In [65]: import decimal
In [66]: Decimal(1.115).quantize(Decimal(0.00), rounding=decimal.ROUND_HALF_UP)
Out[66]: Decimal(1.12)
In [67]: Decimal(0.125).quantize(Decimal(0.00), rounding=decimal.ROUND_HALF_UP)
Out[67]: Decimal(0.13)
Decimal().quantize里添加rounding=decimal.ROUND_HALF_UP参数,实测有效.
其他答主以及类似问题答案 都是不做测试的辣鸡
转贴一个经测试无误的https://blog.csdn.net/a200822146085/article/details/89181439
刚刚遇到类似的问题。python3里面可以这么解决。 int(17.955*100)/100即可
我最近刚学的python,关于这个问题我觉得可以这样干
如果要求是保留小数点后2位的话(非科学记数法),可以这样干:
#x is for the number which is need to be converted#
round(x*100)/100
好吧,没仔细看提问,测试了一下,上面这个靠不住,不对。会吧0.005舍掉。
def round(num,i): return (int((num+5*10**(-i- 1))*10**i)/10**i)你看这样可以么
我自己定义了一个比较繁琐的函数,通过字元的形式进行处理。
def myround(num,dpnum=0):
python的round()函数实现的四舍五入与我们正常理解的四舍五入有所区别,本函数实现我们正常
理解一致的四舍五入功能相同的功能。
参数num为要四舍五入的数,参数dpnum为要保留的小数位,默认取整数。
参数dpnum必须为正整数。
本函数对于负数的四舍五入为取绝对值的四舍五入。
如果参数错误会显示「Error:参数错误!,并返回None。
if (isinstance(num,int) or isinstance(num,float)) and dpnum&>=0 and isinstance(dpnum,int):
strnum=str(num)
if . in strnum:
x=dpnum-len(strnum[strnum.index(.)+1:])
if x&<0:
if int(strnum[strnum.index(.)+1+dpnum])&>=5 and num&>=0:
fdnum=float(strnum[:strnum.index(.)+1+dpnum])+float(.*(dpnum-1)+0*(dpnum-1)+1)
elif int(strnum[strnum.index(.)+1+dpnum])&>=5 and num&<0:
fdnum=float(strnum[:strnum.index(.)+1+dpnum])-float(.*(dpnum-1)+0*(dpnum-1)+1)
else:
fdnum=float(strnum[:strnum.index(.)+1+dpnum])
else:
fdnum=float(strnum)
else:
fdnum=float(strnum)
return fdnum
else:
print uError:参数错误!
import decimal
def four_down_five_up(number):
decimal.getcontext().rounding=decimal.ROUND_HALF_UP
b=decimal.Decimal(str(number),decimal.getcontext())
return float(b.__round__(2))
推荐阅读: