精华内容
下载资源
问答
  • python 四舍五入

    2020-11-29 12:22:01
    Python四舍五入的正确打开方式! round( )函数简介 菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。 > round( x [, n] ) 参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留...

     

    强转int会向下取整

    int(2.9),结果为2

     

    四舍五入就用round( )?Python四舍五入的正确打开方式!

     

    round( )函数简介

    菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。

    > round( x [, n]  )
    
    •  

    参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

    >>> round(2.3)
    2
    >>> round(2.45, 1)
    2.5
    
    •  

    特殊情况

    上面的结果并没有错误,这里再用2.675测试一下:

    >>> round(2.675, 2)
    2.67
    
    • 1
    • 2

    显然结果不符合四舍五入的规则。为什么会这样呢?原因是:round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。

    这也就解释了上述现象。可这样一来用round()函数取浮点数的四舍五入值不就变得不可靠了嘛?这样的函数设计的意义何在?网上搜了一圈答案,觉得这个说法比较准确:

    python3(注意python2 和 3的round()是不一样的,这里仅以python3作说明)中round()对浮点数的取舍遵循的是“四舍六入五平分”,“五平分”就是根据取舍的位数前的小数奇偶性来判断,奇偶平分,符合公平性原则(四舍五入不是公平的),这样一来也就保证了在数据量较大的情况下,筛选数据的真实性。(数学渣,不知道这样理解对否……)

    为什么需要平分呢?原因就是部分小数无法用二进制完整表示,如1.15,转为二进制将是很长的一串数字:1.0010011001100110011001100110011001100110011001100110011 这可不是简单的几个字节就能存放下的。因此这里就出现了取舍的问题。

    那么正确的四舍五入是否无法实现了呢?当然是有解决办法的。比如,当你需要四舍五入保留两位小数的时候,可以将数值乘以100再除以100.0:

    >>> round(2.675 * 100)/100.0
    2.68
    
    •  

    这样可以解决部分浮点数四舍五入的问题。为什么是部分呢?笔者发现:

    >>> round(2.135*100)/100.0
    2.13
    
    •  

     

    检验下过程:

    >>> 2.135*100
    213.49999999999997
    
    • 1

    WTF!是精度问题嘛!

    >>> Decimal(2.135)*100
    Decimal('213.4999999999999786837179272')
    
    • 1
    • 2

    愣住

    无法理解是不是!!二进制的世界正常人真的不懂,盼望一下未来有可以直接计算十进制的硬件诞生吧。

    总结

    在用round()函数进行四舍五入时,如果你对结果有十足把握,并且这就是你想要的结果,那就放心大胆地使用。不然就老老实实写个函数来实现吧,这不是什么难事。

    展开全文
  • Python四舍五入

    2020-11-12 18:01:30
    Python四舍五入的方法闲暇之余写的一个四舍五入的方法整体思路不说废话直接上代码运行结果待优化部分 闲暇之余写的一个四舍五入的方法 整体思路 先把要保留的部分截下来,然后遍历后续小数位,最终需要进位就给保留...

    闲暇之余写的一个四舍五入的方法

    整体思路

    先把要保留的部分截下来,然后遍历后续小数位,最终需要进位就给保留部分+个0.x1 不需要进位就把保留部分直接返回。技艺不精,若有大神路过轻喷~

    不说废话直接上代码

    def new_type(testNum,b=2):
        """
        :param testNum: 原数字
        :param b: 保留位数
        :return: 四舍五入后的结果
        """
        testNum = str(testNum)
        pointIndex =  testNum.find(".") # 获取原数据小数点下标index
        if pointIndex == -1:
            return testNum
        splList = testNum.split(".") # 分割整数和小数部分
        if len(splList[1])<=b:
            return testNum
        staticNum = testNum[0:(pointIndex+b+1)] # 整数.保留位数
        bsNum = list(testNum[pointIndex+b+1:]) # 待取舍部分
        bsNum.reverse() # 倒序,为了配合for in语法
        c = 0 # 遍历取舍部分,判定最终是否进1
        for i in bsNum:
            if (int(i)+c) >= 5:
                c = 1
            else:
                c = 0
        if c == 0:
            return staticNum
        # 对保留部分作进1处理
        staticNum = list(testNum[0:(pointIndex + b + 1)])
        if c == 1:
            staticNum[-1] = str(int(staticNum[-1]) + 1)
        finalNum = ""
        for i in staticNum:
            finalNum += i
        return float(finalNum)
    

    运行结果

    在这里插入图片描述
    在这里插入图片描述

    待优化部分

    明明只想给小数点最后一位+个1,结果居然需要先转列表,取值转int+1 再转str。
    然后还要再遍历一次拼接,转float。
    为了加这个1,性能代价超级大,不合理

    展开全文
  • 菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。 round( x [, n] ) 参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。 &amp;amp...

    round( )函数简介

    菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。

    > round( x [, n]  )
    

    参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

    >>> round(2.3)
    2
    >>> round(2.45, 1)
    2.5
    

    特殊情况

    上面的结果并没有错误,这里再用2.675测试一下:

    >>> round(2.675, 2)
    2.67
    

    显然结果不符合四舍五入的规则。为什么会这样呢?原因是:round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。

    这也就解释了上述现象。可这样一来用round()函数取浮点数的四舍五入值不就变得不可靠了嘛?这样的函数设计的意义何在?网上搜了一圈答案,觉得这个说法比较准确:

    python3(注意python2 和 3的round()是不一样的,这里仅以python3作说明)中round()对浮点数的取舍遵循的是“四舍六入五平分”,“五平分”就是根据取舍的位数前的小数奇偶性来判断,奇偶平分,符合公平性原则(四舍五入不是公平的),这样一来也就保证了在数据量较大的情况下,筛选数据的真实性。(数学渣,不知道这样理解对否……)

    为什么需要平分呢?原因就是部分小数无法用二进制完整表示,如1.15,转为二进制将是很长的一串数字:1.0010011001100110011001100110011001100110011001100110011 这可不是简单的几个字节就能存放下的。因此这里就出现了取舍的问题。

    那么正确的四舍五入是否无法实现了呢?当然是有解决办法的。比如,当你需要四舍五入保留两位小数的时候,可以将数值乘以100再除以100.0:

    >>> round(2.675 * 100)/100.0
    2.68
    

    这样可以解决部分浮点数四舍五入的问题。为什么是部分呢?笔者发现:

    >>> round(2.135*100)/100.0
    2.13
    

    黑人问号

    检验下过程:

    >>> 2.135*100
    213.49999999999997
    

    WTF!是精度问题嘛!

    >>> Decimal(2.135)*100
    Decimal('213.4999999999999786837179272')
    

    愣住

    无法理解是不是!!二进制的世界正常人真的不懂,盼望一下未来有可以直接计算十进制的硬件诞生吧。

    总结

    在用round()函数进行四舍五入时,如果你对结果有十足把握,并且这就是你想要的结果,那就放心大胆地使用。不然就老老实实写个函数来实现吧,这不是什么难事。

    展开全文
  • 一直为Python的四舍五入感到困惑。机缘情况下,对Python四舍五入及Decimal能否达到我们平常日常生活中所用的的四舍五入进行一些实验和思考。一切以实验数据说话。

    Python四舍五入大法

    一直为Python的四舍五入感到困惑。机缘情况下,对Python四舍五入及Decimal能否达到我们平常日常生活中所用的的四舍五入进行一些实验和思考。一切以实验数据说话。

    round和Decimal的比对(默认decimal.ROUND_HALF_EVEN)

    print(round(3.155, 2))  # 输出3.15,精确度差导致四舍五入不准确
    print(Decimal('3.145').quantize(Decimal('0.00')))  # 输出3.14,默认decimal.ROUND_HALF_EVEN,四舍五入,向最后一位有效数字最近的偶数取整
    print(Decimal('-3.145').quantize(Decimal('0.00')))  # 输出-3.14,默认decimal.ROUND_HALF_EVEN,四舍五入,向最后一位有效数字最近的偶数取整
    print(Decimal('3.155').quantize(Decimal('0.00')))  # 输出3.16,默认decimal.ROUND_HALF_EVEN,四舍五入,向最后一位有效数字最近的偶数取整
    print(Decimal('-3.155').quantize(Decimal('0.00')))  # 输出-3.16,默认decimal.ROUND_HALF_EVEN,四舍五入,向最后一位有效数字最近的偶数取整
    

    decimal.ROUND_CEILING和decimal.ROUND_FLOOR

    print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_CEILING))  # 输出3.16,总是趋向无穷大向上取整
    print(Decimal('-3.159').quantize(Decimal('0.00'), decimal.ROUND_CEILING))  # 输出-3.15,总是趋向无穷大向上取整
    print(Decimal('3.159').quantize(Decimal('0.00'), decimal.ROUND_FLOOR))  # 输出3.15,总是趋向负无穷大向下取整
    print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_FLOOR))  # 输出-3.16,总是趋向负无穷大向下取整
    

    decimal.ROUND_UP和decimal.ROUND_DOWN

    print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_UP))  # 输出3.16,朝0的反方向取整
    print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_UP))  # 输出-3.16,朝0的反方向取整
    print(Decimal('3.159').quantize(Decimal('0.00'), decimal.ROUND_DOWN))  # 输出3.15,总是趋向0取整
    print(Decimal('-3.159').quantize(Decimal('0.00'), decimal.ROUND_DOWN))  # 输出-3.15,总是趋向0取整
    

    decimal.ROUND_HALF_UP和decimal.ROUND_HALF_DOWN

    print(Decimal('3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 输出3.15,四舍五入,大于等于5朝0的反方向取整
    print(Decimal('-3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 输出-3.15,四舍五入,大于等于5朝0的反方向取整
    print(Decimal('3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 输出3.16,四舍五入,大于等于5朝0的反方向取整
    print(Decimal('-3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_UP))  # 输出-3.16,四舍五入,大于等于5朝0的反方向取整
    
    print(Decimal('3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 输出3.14,五舍六入,小于等于5总是趋向0取整
    print(Decimal('-3.145').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 输出-3.14,五舍六入,小于等于5总是趋向0取整
    print(Decimal('3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 输出3.15,五舍六入,小于等于5总是趋向0取整
    print(Decimal('-3.155').quantize(Decimal('0.00'), decimal.ROUND_HALF_DOWN))  # 输出-3.15,五舍六入,小于等于5总是趋向0取整
    

    decimal.ROUND_05UP

    print(Decimal('3.151').quantize(Decimal('0.00'), decimal.ROUND_05UP))  # 输出3.16,官方解释是如果是0或5,则朝0的反方向取整,否则朝0取整,但是实验结果貌似不是这样
    print(Decimal('-3.151').quantize(Decimal('0.00'), decimal.ROUND_05UP))  # 输出-3.16,官方解释是如果是0或5,则朝0的反方向取整,否则朝0取整,但是实验结果貌似不是这样
    

    结论

    经过了以上的比对后,发现decimal.ROUND_HALF_UP的用法,更贴近我们日常生活中对四舍五入的用法习惯。

    展开全文
  • python 四舍五入问题如何解决 实际业务场景中,我们需要对数据求和。但是发现两位小数的数据相加会得到十几位小数,对于这种情况我们需要对数据进行四舍五入,可是发现四舍五入过程有很对问题,对‘11.245’,‘11....
  • Python四舍五入问题详解

    千次阅读 2019-05-27 16:44:15
    Python四舍五入问题如何解决 问题的来历 谈起这个问题的缘由,大家都应该感到困惑。本来一个简单的问题,为什么被罗瑟姆君给搞得七荤八素,难道Python误入歧途了?其实,还要从Python的设计目标谈起。 Python的...
  • 本文深入讲解Python3中 四舍五入、 截断保留 与 保留小数位数、取整,帮助Python初学者排坑! 总结不易,转载请标明出处:https://blog.csdn.net/weixin_41683971/article/details/105027654 文章目录0. 前言(吐槽...
  • 1、格式化输出 {:.2f},2是保留几位有效数字的意思 print("{:.2f}".format(1/6)) 输出:0.17 2、使用 round函数 round(a,2),2是保留几位有效数字的意思,a是需要处理的数字 ...[1]python四舍五入保留2位小数 ...
  • Python四舍五入函数

    2021-04-21 10:42:03
    四舍五入函数: round(x, y) X:为你想要四舍五入的数 Y:为你想保留小数点后几位
  • 如何使用python四舍五入?保留n位小数的最佳方法 功能: 将数字四舍五入到指定的位数。 代码: from decimal import Decimal, ROUND_HALF_UP def round_up(number, num_digits): """ 按指定位数对数值进行四舍...
  • import math a = 3.2 b = -4.4 c = 4.6 d = 3.6 print(round(a),round(d),round(b),round(c)) 3 4 -4 5 四舍五入保留小数位数 import math a = 213.469 b = -4.438 c = 4.631 d = 3.673 print(round(a),round(d),...
  • python四舍五入float

    2020-06-16 16:59:45
    项目上遇到一个问题是要对folat保留2位小数,查了相关资料,python竟然没有靠谱的四舍五入的函数,自己写了一个,只是采用了C语言的方式做四舍五入,但是函数里边还需要加入一些判断条件保证健壮性,需要朋友们可以...
  • 小数位的四舍五入在项目中经常用到。 你可能有注意到 round 函数不能真正做到四舍五入。 round() 函数作用就是,返回浮点数x的四舍五入值。 round( x [, n] ) 简单来说就是在浮点运算的时候丢精度。 这个与...
  • 这时,如果我们需要对其做一些运算,比如四舍五入,由于实际操作的对象是二进制浮点数,而二进制浮点数常常又无法精确的表示十进制浮点数,这时就会存在误差。看如下例子。 可以看到,当我们直接用round函数对3....
  • 菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。 > round( x [, n] ) 参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。 >>...
  • python 四舍五入的问题

    2021-02-20 23:51:41
    在调用python的round 函数时,出现了令我意外的结果,具体如下图所示: 纠正方法如下: 参考博客:https://www.cnblogs.com/ShaYeBlog/p/7646649.html
  • python 四舍五入保留小数输出

    千次阅读 2018-05-10 15:54:41
    可以参考详细博客 比如 x = 0.94532 四舍五入保留小数点后2位: print('the result is %.2f'%x) .2表示保留小数点后两位数,f表示float浮点数,
  • 1、四舍五入取整   利用int()函数截断取整。 a = 4.4 b = 5.6 print("Rounded a:", int(a + 0.5)) print("Rounded b:", int(b + 0.5)) --------------------------------------- Output: Rounded a: 4 Rounded b...
  • 当传入的是以2.5 , 4.5 ,6.5结尾的时候,这个5就直接被省略了。其他情况结尾时,四舍五入功能还存在。
  • python四舍五入的最佳方法

    千次阅读 2019-05-16 10:59:14
    失败: def round_dec(n, d=2): s = '0.' + '0' * d return Decimal(n).quantize(Decimal(s), rounding=ROUND_HALF_UP) >>>print(Decimal(3.5850)) >...3.584999999999999964472863211994990...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,903
精华内容 761
关键字:

python四舍五入

python 订阅