美文网首页
python内置方法round()四舍五入方法问题

python内置方法round()四舍五入方法问题

作者: 洛奇lodge | 来源:发表于2021-10-15 16:58 被阅读0次
问题描述
  • 最近在项目中数据出现问题,经过排查,原来是round()惹得祸,如下图所示,round()进行保留位数,并不是按照我们数学上的逻辑四舍五入进行保留
  • 查看官网https://docs.python.org/zh-cn/3/library/functions.html?highlight=round#round,可以看出,这个并不是round函数错误,只能说浮点数在计算机存储是比较特殊,如传入参数2.675,实际计算存储是2.67499999999..., 所以在保留位数时候就会出现问题
问题解决
  • 方案一
def new_round(_float, _len):
    """
    判断需要保留位数后的一位是不是5,如果是5,变成6,在使用round进行四舍五入
    :param _float:
    :param _len:
    :return:
    """

     if isinstance(_float, float) or isinstance(_float, np.float):
        # 小数位数小于保留长度, 直接返回
        if str(_float)[::-1].find('.') <= _len:
            return _float
        if str(_float).split('.')[1][_len] == '5':
            _float = float(str(_float).split('.')[0] + '.' + str(_float).split('.')[1][:_len]+'6')
    elif isinstance(_float, pd.Series):
        _float = _float.apply(lambda x: float(str(x).split('.')[0] + '.' + str(x).split('.')[1][:_len]+'6') \
                              if len(str(x).split('.'))==2 and len(str(x).split('.')[1])>_len and str(x).split('.')[1][_len] == '5' \
                              else x)
    return round(_float, _len)
  • 方案二
def new_round(_float, _len):
    """
    通过Decimal模板进行精确度处理四舍五入
    传入Decimal参数必须是字符串,才能生效
    :param _float:
    :param _len:
    :return:
    """
    _len_str = '0.' + '0' * _len
    if isinstance(_float, float) or isinstance(_float, np.float):
        _float = float(Decimal(str(_float)).quantize(Decimal(_len_str), rounding=ROUND_HALF_UP))
    elif isinstance(_float, pd.Series):
        _float = _float.apply(lambda x: float(Decimal(str(x)).quantize(Decimal(_len_str), rounding=ROUND_HALF_UP)))
    return _float

相关文章

  • python内置方法round()四舍五入方法问题

    问题描述 最近在项目中数据出现问题,经过排查,原来是round()惹得祸,如下图所示,round()进行保留位数,...

  • Python四舍五入

    通常,python四舍五入使用内置的round函数就可以了 然而,对于需要精确的四舍五入,就有问题 原因是,部分小...

  • round函数

    描述round() 方法返回浮点数x的四舍五入值。语法以下是 round() 方法的语法:round( x [, ...

  • Python 2 与 python 3的区别

    python3已经将print置为内置函数,因此输出用print() round()四舍五入函数: python3...

  • js 保留两位小数(四舍五入)

    利用round方法进行保留两位小数(带四舍五入)的处理 计算方法:Math.round(X * 100) / 100

  • MySQL ROUND函数:四舍五入 注意事项

    MySQL ROUND函数:四舍五入,注意round方法只支持 decimal类型的数据,float double...

  • Android中的Math.round(),Math.floor

    Math.round()方法: 表示的是“四舍五入”计算。Math.round(1.5) = 2Math.roun...

  • Python小数点精度控制

    问题描述:Python中在小数精度控制是最常用便捷的是round,但round并不是简单的四舍五入,而是ROUND...

  • js Math 对象方法

    Math 对象方法基本方法 Math.round();向上四舍五入。 Math.ceil();向上取整,有小数就整...

  • 格式化输出

    一、输出整数 二、输出浮点数 % 用法 round()函数 round() 方法返回浮点数x的四舍五入值,但会因为...

网友评论

      本文标题:python内置方法round()四舍五入方法问题

      本文链接:https://www.haomeiwen.com/subject/mcymoltx.html