python中的四舍六入五平分

        最近学python,发现浮点数计算得不到想要的精度(据查:浮点数本身就不精确),推荐使用decimal。然后又发现小数截取上也有些问题:与以往用的其它语言完全不一样。通常情况下四舍五入,看被舍弃位数是否大于4,大于就进一位,否则就舍弃。python的结果就有眯难以理解了。据查是叫作“四舍六入五平分”,即小于等于4舍弃,大于等于6进一位,5则看5前一位是奇是偶,奇进偶不进。结果尝试一下,发现并非如此。

       环境:win10+vs code1.61.2+python3.10

        代码如下:

print('四舍五入6.605=', round(Decimal(6.605), 2))
print('四舍五入6.615=', round(Decimal(6.615), 2))
print('四舍五入6.625=', round(Decimal(6.625), 2))
print('四舍五入6.635=', round(Decimal(6.635), 2))
print('四舍五入6.645=', round(Decimal(6.645), 2))
print('四舍五入6.655=', round(Decimal(6.655), 2))
print('四舍五入6.665=', round(Decimal(6.665), 2))
print('四舍五入6.675=', round(Decimal(6.675), 2))
print('四舍五入6.685=', round(Decimal(6.685), 2))
print('四舍五入6.695=', round(Decimal(6.695), 2))
print()
print('四舍五入6.705=', round(Decimal(6.705), 2))
print('四舍五入6.715=', round(Decimal(6.715), 2))
print('四舍五入6.725=', round(Decimal(6.725), 2))
print('四舍五入6.735=', round(Decimal(6.735), 2))
print('四舍五入6.745=', round(Decimal(6.745), 2))
print('四舍五入6.755=', round(Decimal(6.755), 2))
print('四舍五入6.765=', round(Decimal(6.765), 2))
print('四舍五入6.775=', round(Decimal(6.775), 2))
print('四舍五入6.785=', round(Decimal(6.785), 2))
print('四舍五入6.795=', round(Decimal(6.795), 2))

        结果如下:

四舍五入6.605= 6.61            
四舍五入6.615= 6.62    V        
四舍五入6.625= 6.62    V        
四舍五入6.635= 6.63
四舍五入6.645= 6.64    V        
四舍五入6.655= 6.66    V        
四舍五入6.665= 6.67
四舍五入6.675= 6.67
四舍五入6.685= 6.68    V
四舍五入6.695= 6.70    V

四舍五入6.705= 6.71    
四舍五入6.715= 6.71    
四舍五入6.725= 6.72    V
四舍五入6.735= 6.74    V
四舍五入6.745= 6.75
四舍五入6.755= 6.75
四舍五入6.765= 6.76    V
四舍五入6.775= 6.78    V
四舍五入6.785= 6.79
四舍五入6.795= 6.79

        并没有所谓的“五平分”:前面是0的均进位,后面有‘V’表示遵循了奇进偶不进的原则。正准备表示不知道原因时,想到了传入数值的问题,一开始的写法是‘round(6.605,2)’,再又改成'round(Decimal(6.705), 2)',结果还是随缘。继续度一下,看到一个文章写的也是传入数值的问题,只不过他研究比我更深入,我只想到了一,而没想到二。文章说“一旦要做精确计算,那么就不应该再单独使用浮点数,而是应该总是使用 Decimal('浮点数')。否则,当你赋值的时候,精度已经被丢失了,建议全程使用Decimal”。

        我再次尝试'round(Decimal('6.705'), 2)',完全符合“四舍六入五平分”的原则,因为在Decimal(6.705)中,本身传入的就是一个不精确的浮点数,所以得不到预期结果。

        启示:不是最终结果不轻易进行取舍,进行数学计算时要全程使用decimal,需要四舍五入时可以自定义一个函数。

你可能感兴趣的:(python学习,python,开发语言,后端)