Python论坛  - 讨论区

标题:[python-chinese] 再给大家出道题 写一个银行家版本的四舍五入函数

2006年01月23日 星期一 11:42

魏忠 weizhong2004 at gmail.com
Mon Jan 23 11:42:19 HKT 2006

大家知道 Python自带的 round函数是传统规则,目前流行语言的四舍五入则是银行家规则(从统计学上更科学些)

银行家的规则是这样的
比方说要保留1位小数,原数小数点后只有2位,当小数点后第二位是 5 时就要看前面一位是奇数还是偶数,如果是偶数则将第二位舍弃,如果是奇数则进位。
如果小数点后有效位超过两位,当小数点后第二位是 5 时就直接进位了比方说 round(3.45003,1)这个数是大于3.45的,升为3.5。
如果刚好是3.45则要舍去,结果为3.4
我将规则在此用例子重复一下

round(3.45,1)
传充round 得到 3.5 银行家round得到 3.4
round(3.45002,1)
传统round 得到 3.5 银行家round也得到3.5
round(3.35,1)
传充round 得到 3.4 银行家round得到 3.4
round(3.35002,1)
传统round 得到 3.4 银行家round也得到3.4


--

开飞机的舒克
http://www.lvye.org/shuke
msn:weizhong at netease.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060123/a014d380/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年01月23日 星期一 12:10

limodou limodou at gmail.com
Mon Jan 23 12:10:43 HKT 2006

在 06-1-23,魏忠<weizhong2004 at gmail.com> 写道:
> 大家知道 Python自带的 round函数是传统规则,目前流行语言的四舍五入则是银行家规则(从统计学上更科学些)
>
> 银行家的规则是这样的
> 比方说要保留1位小数,原数小数点后只有2位,当小数点后第二位是 5
> 时就要看前面一位是奇数还是偶数,如果是偶数则将第二位舍弃,如果是奇数则进位。
> 如果小数点后有效位超过两位,当小数点后第二位是 5 时就直接进位了比方说 round(3.45003,1)这个数是大于3.45的,升为3.5。
> 如果刚好是3.45则要舍去,结果为3.4
> 我将规则在此用例子重复一下
>
> round(3.45,1)
> 传充round 得到 3.5 银行家round得到 3.4
> round(3.45002,1)
> 传统round 得到 3.5 银行家round也得到3.5
> round(3.35,1)
>  传充round 得到 3.4 银行家round得到 3.4
>  round(3.35002,1)
>  传统round 得到 3.4 银行家round也得到3.4
>

有趣。


--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年01月23日 星期一 12:27

hoxide Ma hoxide at gmail.com
Mon Jan 23 12:27:21 HKT 2006

这个是在带误差计算中用的方法, 大家做普物实验就是这样算的啊, 还有带误差加法, 乘法, 等等.


在 06-1-23,limodou<limodou at gmail.com> 写道:
> 在 06-1-23,魏忠<weizhong2004 at gmail.com> 写道:
> > 大家知道 Python自带的 round函数是传统规则,目前流行语言的四舍五入则是银行家规则(从统计学上更科学些)
> >
> > 银行家的规则是这样的
> > 比方说要保留1位小数,原数小数点后只有2位,当小数点后第二位是 5
> > 时就要看前面一位是奇数还是偶数,如果是偶数则将第二位舍弃,如果是奇数则进位。
> > 如果小数点后有效位超过两位,当小数点后第二位是 5 时就直接进位了比方说 round(3.45003,1)这个数是大于3.45的,升为3.5。
> > 如果刚好是3.45则要舍去,结果为3.4
> > 我将规则在此用例子重复一下
> >
> > round(3.45,1)
> > 传充round 得到 3.5 银行家round得到 3.4
> > round(3.45002,1)
> > 传统round 得到 3.5 银行家round也得到3.5
> > round(3.35,1)
> >  传充round 得到 3.4 银行家round得到 3.4
> >  round(3.35002,1)
> >  传统round 得到 3.4 银行家round也得到3.4
> >
>
> 有趣。
>
>
> --
> I like python!
> My Blog: http://www.donews.net/limodou
> NewEdit Maillist: http://groups.google.com/group/NewEdit
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>


--
==========================================================

A student of Math in Soochow University in China.
Intrested in Math, Python, Octave, Lisp, Maxima, Prolog and .NET/MONO.

Blog: http://blog.sina.com.cn/blog/1142604745
Wiki: http://wiki.woodpecker.org.cn/moin/Hoxide

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年01月23日 星期一 12:35

xxmplus xxmplus at gmail.com
Mon Jan 23 12:35:24 HKT 2006

银行就是靠小数点来发财的

在 06-1-23,hoxide Ma<hoxide at gmail.com> 写道:
> 这个是在带误差计算中用的方法, 大家做普物实验就是这样算的啊, 还有带误差加法, 乘法, 等等.
>
>
> 在 06-1-23,limodou<limodou at gmail.com> 写道:
> > 在 06-1-23,魏忠<weizhong2004 at gmail.com> 写道:
> > > 大家知道 Python自带的 round函数是传统规则,目前流行语言的四舍五入则是银行家规则(从统计学上更科学些)
> > >
> > > 银行家的规则是这样的
> > > 比方说要保留1位小数,原数小数点后只有2位,当小数点后第二位是 5
> > > 时就要看前面一位是奇数还是偶数,如果是偶数则将第二位舍弃,如果是奇数则进位。
> > > 如果小数点后有效位超过两位,当小数点后第二位是 5 时就直接进位了比方说 round(3.45003,1)这个数是大于3.45的,升为3.5。
> > > 如果刚好是3.45则要舍去,结果为3.4
> > > 我将规则在此用例子重复一下
> > >
> > > round(3.45,1)
> > > 传充round 得到 3.5 银行家round得到 3.4
> > > round(3.45002,1)
> > > 传统round 得到 3.5 银行家round也得到3.5
> > > round(3.35,1)
> > >  传充round 得到 3.4 银行家round得到 3.4
> > >  round(3.35002,1)
> > >  传统round 得到 3.4 银行家round也得到3.4
> > >
> >
> > 有趣。
> >
> >
> > --
> > I like python!
> > My Blog: http://www.donews.net/limodou
> > NewEdit Maillist: http://groups.google.com/group/NewEdit
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese at lists.python.cn
> > Subscribe: send subscribe to python-chinese-request at lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> >
>
>
> --
> ==========================================================
>
> A student of Math in Soochow University in China.
> Intrested in Math, Python, Octave, Lisp, Maxima, Prolog and .NET/MONO.
>
> Blog: http://blog.sina.com.cn/blog/1142604745
> Wiki: http://wiki.woodpecker.org.cn/moin/Hoxide
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年01月23日 星期一 12:49

Albert Lee hanzhupeng at gmail.com
Mon Jan 23 12:49:14 HKT 2006

随便写了一个,没有考虑太多优化和完整性判断


# -*- coding: cp936 -*-
def bround(num, pos):
    print '---', num, '--',pos
    s = str(num)
    s_point = s.find('.') + pos

    base = s[:s_point+1]
    tail = s[s_point+1:]

    if tail[0] in '01234':
        return float(base)
    elif tail[0] in '6789':
        return float(base) + 1.0/pow(10,pos)

    elif len(tail)>1 and int(tail[1:]) > 0: # 50001
        return float(base) + 1.0/pow(10,pos)

    else:  # 5
        if base[-1] == '.':last_p = base[-2]
        else: last_p = base[-1]
        if last_p in '02468':
            return float(base)
        else:
            return float(base) + 1.0/pow(10,pos)


print bround(3.44, 1)
print bround(3.46, 1)
print bround(3.4, 0)
print bround(3.6, 0)

print bround(3.45,1)
#传充round 得到 3.5 银行家round得到 3.4

print bround(3.45002,1)
#传统round 得到 3.5 银行家round也得到3.5

print bround(3.35,1)
#传充round 得到 3.4 银行家round得到 3.4

print bround(3.35002,1)
#传统round 得到 3.4 银行家round也得到3.4

----------------- 结果:
--- 3.44 -- 1
3.4
--- 3.46 -- 1
3.5
--- 3.4 -- 0
3.0
--- 3.6 -- 0
4.0
--- 3.45 -- 1
3.4
--- 3.45002 -- 1
3.5
--- 3.35 -- 1
3.4
--- 3.35002 -- 1
3.4

在06-1-23,limodou <limodou at gmail.com> 写道:
>
> 在 06-1-23,魏忠<weizhong2004 at gmail.com> 写道:
> > 大家知道 Python自带的 round函数是传统规则,目前流行语言的四舍五入则是银行家规则(从统计学上更科学些)
> >
> > 银行家的规则是这样的
> > 比方说要保留1位小数,原数小数点后只有2位,当小数点后第二位是 5
> > 时就要看前面一位是奇数还是偶数,如果是偶数则将第二位舍弃,如果是奇数则进位。
> > 如果小数点后有效位超过两位,当小数点后第二位是 5 时就直接进位了比方说 round(3.45003,1)这个数是大于3.45的,升为3.5。
> > 如果刚好是3.45则要舍去,结果为3.4
> > 我将规则在此用例子重复一下
> >
> > round(3.45,1)
> > 传充round 得到 3.5 银行家round得到 3.4
> > round(3.45002,1)
> > 传统round 得到 3.5 银行家round也得到3.5
> > round(3.35,1)
> >  传充round 得到 3.4 银行家round得到 3.4
> >  round(3.35002,1)
> >  传统round 得到 3.4 银行家round也得到3.4
> >
>
> 有趣。
>
>
> --
> I like python!
> My Blog: http://www.donews.net/limodou
> NewEdit Maillist: http://groups.google.com/group/NewEdit
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>


--
欢迎访问我的小站:   http://www.2tuzi.com
blog :   http://blog.2tuzi.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060123/990590fd/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年01月23日 星期一 13:19

魏忠 weizhong2004 at gmail.com
Mon Jan 23 13:19:47 HKT 2006

俺的实现:(由php版本改写而来)
#!/usr/bin/env python
#coding=utf8
#普通的银行家四舍五入法
def round_(afloat,c):
    if afloat==0: return 0
    r=str(afloat).split('.')
    dotlen=len(r[1])
    if c>=dotlen: return afloat
    else:
        flag=r[1][c]
        if flag!='5': return round(afloat,c)
        else:
            a=r[1][:c+1]
            if r[1]>a: return round(afloat,c)
            else: return round(round(afloat/2,c)*2,c)

--

开飞机的舒克
http://www.lvye.org/shuke
msn:weizhong at netease.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060123/ea2f2848/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号