V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ukipoi
V2EX  ›  程序员

我想问一下,怎样的四舍五入更科学?

  •  
  •   ukipoi · 2020-07-07 17:27:12 +08:00 via Android · 3380 次点击
    这是一个创建于 1600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    -0.5 的四舍五入,是 0 更正确还是-1 更正确?

    我试了下 excel 默认的 round,得到的是-1 。

    那财务里面会注意这种四射五入吗?

    24 条回复    2020-07-08 05:39:35 +08:00
    Keyblade
        1
    Keyblade  
       2020-07-07 17:32:09 +08:00
    “若原数值为负数,则先以绝对值求得结果后再加负号”
    https://zh.wikipedia.org/wiki/%E6%95%B0%E5%80%BC%E4%BF%AE%E7%BA%A6
    ukipoi
        2
    ukipoi  
    OP
       2020-07-07 17:34:49 +08:00 via Android
    @Keyblade 那-0.5 四舍五入完-1,-0.5+1 四射五入完是 1,本来相差 1 的数后面相差了 2,这样得到的结果是否符合我们的期望呢?
    Keyblade
        3
    Keyblade  
       2020-07-07 17:40:07 +08:00
    @ukipoi #2 你要觉得四舍五入不行还有五舍六入、五舍六入五留
    看你需求来呗
    Keyblade
        4
    Keyblade  
       2020-07-07 17:40:29 +08:00
    @Keyblade #3 错一个字,是四舍六入五留
    Shawn211
        5
    Shawn211  
       2020-07-07 17:59:37 +08:00
    @ukipoi 我个人觉得算符合呢哈哈,因为我觉得重点还在看“保留到第几位”

    就好比说四舍五入保留到百位,那么 49 和-49 都变成 0,可是原本相差 98 呢

    所以说,四舍五入符不符合期望,不单单就只是看“四舍五入”这个方法,还要看你保留到第几位

    比如你说的-0.5 和 0.5,四舍五入保留到十分位,甚至百分位、千分位,都是很符合期望的

    从这看来,四舍五入中的保留到第几位,会影响到误差的大小(也就出现 2 楼的情况啦)

    对于“财务里面会注意这种四射五入吗?”,我个人猜测在最后得到结果时,保留到分单位就可以啦(如果结果还要进行下一步的处理,就不四舍五入)
    qiayue
        6
    qiayue  
       2020-07-07 18:06:01 +08:00
    四舍五入可以理解为在数轴上的任意一点,给归类到最近的整数点上去
    0.5 刚好是 1 的一半,与 0 和 1 的距离相同,这个时候我们定义了规则,五入,所以 0.5 右侧的点都归类到 1 上了。
    类似的,对称处理,-0.5 也会被归类到-1 上。
    又因为都是近似处理,造成了误差,两个 0.5 的误差是 1,再加上本身的距离 1,所以差是 2
    Vegetable
        7
    Vegetable  
       2020-07-07 18:18:39 +08:00
    貌似负数四舍五入的标准和去掉负号的正数是一样的。
    round(0.5) == 0
    rount(1.5) == 2
    这是银行家舍入法,但是 Excel 用的不是银行家舍入,就是普通四舍五入,一样也是和去掉负号的正数逻辑。
    Vegetable
        8
    Vegetable  
       2020-07-07 18:25:21 +08:00
    Excel 的说明

    When rounding a negative number, that number is first converted to its absolute value (its value without the negative sign). The rounding operation then occurs, and then the negative sign is reapplied. Although this may seem to defy logic, it is the way rounding works. For example, using the ROUNDDOWN function to round -889 to two significant digits results in -880. First, -889 is converted to its absolute value of 889. Next, it is rounded down to two significant digits results (880). Finally, the negative sign is reapplied, for a result of -880.

    https://support.microsoft.com/en-us/office/round-a-number-f82b440b-689d-4221-b21e-38da99d33435
    jiejiss
        9
    jiejiss  
       2020-07-07 19:07:36 +08:00
    四舍六入五成双? Python 的 round 就是
    wangritian
        10
    wangritian  
       2020-07-07 19:18:57 +08:00
    0.0~0.9 的 10 个小数,其中 0.0~0.4 计算为 0,0.5~0.9 计算为 1,乍一看 55 开很公平,但 0.0 本身就等于 0,只有剩余 9 个数字真正参与四舍五入了,其中 4 个数字变小,5 个数字变大,所以大量数字的四舍五入结果会偏大一点,所以财务有当小数部分=5 时,整数为偶则舍,整数为奇则进的规则
    Windelight
        11
    Windelight  
       2020-07-07 19:23:25 +08:00 via Android
    三七作五,二进八退
    Windelight
        12
    Windelight  
       2020-07-07 19:24:16 +08:00 via Android
    @Windelight Fix 一下,二退八进
    zjsxwc
        13
    zjsxwc  
       2020-07-07 20:00:43 +08:00 via Android
    把小数点多加几位精度不就好了,财务上四舍五入完全是自寻烦恼
    crclz
        14
    crclz  
       2020-07-07 20:04:09 +08:00
    round2even
    volvo007
        15
    volvo007  
       2020-07-07 21:30:23 +08:00
    四舍六入,五分这几种情况
    1. 5 后面还有多余小数的,进位
    2. 刚好是 5,前面为偶数,不进位
    3. 刚好是 5,前面为奇数,进位

    至于为什么要这么设计,参见 10 楼

    财务上,请用 decimal 函数,基本现在高级一点的语言都有这个类,excel 也有这个函数
    sarvatathagata
        16
    sarvatathagata  
       2020-07-07 21:58:07 +08:00
    真奇怪,C++和 Python 里 round(-0.5)是-1,Pascal 和 Javascript 里 round(-0.5)是 0,这么不统一的吗
    kaiki
        17
    kaiki  
       2020-07-07 22:05:29 +08:00
    @ukipoi 为什么不先算差再四舍五入?
    hoyixi
        18
    hoyixi  
       2020-07-07 22:17:44 +08:00
    数学上没有好坏之分,舍还是入,数学上和工具上,都是随便你,你自己做主。

    所以,具体得看你的业务场景。
    nuistzhou
        19
    nuistzhou  
       2020-07-07 22:27:50 +08:00 via iPhone
    只记得大学物理老师说:四舍六入五凑偶
    mitu9527
        20
    mitu9527  
       2020-07-07 23:14:47 +08:00
    没有哪种更正确,有好几种舍入模式,具体用哪种模式还是取决于需求。
    shc
        21
    shc  
       2020-07-07 23:19:57 +08:00
    科学计算是约成 0 的,四舍六入五平分。
    Phariel
        22
    Phariel  
       2020-07-07 23:25:58 +08:00 via iPhone
    应该让小数位数尽可能的长 长到不影响你的业务逻辑数据的精度 在这个基础上去做 rounding
    MineDog
        23
    MineDog  
       2020-07-07 23:44:13 +08:00 via Android
    应该和取整类似,看具体向上还是向下取整吧
    Iamnotfish
        24
    Iamnotfish  
       2020-07-08 05:39:35 +08:00
    1,尽量避免做除法,无法避免的尽量将除法放在最后去做。
    2,结果保留 6 位小数。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.