python实现小数精确四舍五入 - Go语言中文社区

python实现小数精确四舍五入


一、现象描述

在机器中浮点数不能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。

然而,Python使用四舍六入五留双的方法进行取舍,不能精确实现四舍五入。
如下:
在这里插入图片描述
无论是round,还是demical都不能很好的进行四舍五入,那么我们只能自己定方法来实现精确四舍五入了。

二、自定义四舍五入方法实现精确四舍五入

def round_up(number,power=0):
    """
    实现精确四舍五入,包含正、负小数多种场景
    :param number: 需要四舍五入的小数
    :param power: 四舍五入位数,支持0-∞
    :return: 返回四舍五入后的结果
    """
    digit = 10 ** power
    num2 = float(int(number * digit))
    # 处理正数,power不为0的情况
    if number>=0 and power !=0:
        tag = number * digit - num2 + 1 / (digit * 10)
        if tag>=0.5:
            return (num2+1)/digit
        else:
            return num2/digit
    # 处理正数,power为0取整的情况
    elif  number>=0 and power==0 :
        tag = number * digit - int(number)
        if tag >= 0.5:
            return (num2 + 1) / digit
        else:
            return num2 / digit
    # 处理负数,power为0取整的情况
    elif power==0 and number<0:
        tag = number * digit - int(number)
        if tag <= -0.5:
            return (num2 - 1) / digit
        else:
            return num2 / digit
    # 处理负数,power不为0的情况
    else:
        tag = number * digit - num2 - 1 / (digit * 10)
        if tag <= -0.5:
            return (num2-1)/digit
        else:
            return num2/digit


print(round_up( 2.4259, 0))
print(round_up( -2.625, 2))
print(round_up( -2.635, 2))
print(round_up( 0, 0))

结果示例:
2.0
-2.63
-2.64
0.0

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/a200822146085/article/details/89181439
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢