你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))


推荐阅读:
相关文章