V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rebeccaMyKid
V2EX  ›  问与答

是 C++和 python2.7 的取整规则导致了他们的余数不一样吗?

  •  
  •   rebeccaMyKid · 2017-11-09 18:47:18 +08:00 · 1676 次点击
    这是一个创建于 2575 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看书遇到这个问题,查了些资料上 SO 问了一下被 marked duplicated 了。(T_T)来问下前辈们。

    先说下我的理解和观察到的现象: 首先我们日常说的带余除法用的是欧几里得带余除法,在 C++和 python 里面都不是这种。 C++里面 m%n 的符号跟 m 相同,python 里面 m%n 符号跟 n 相同。我一开始觉得只是不同 implementation 而已,然后发现好像跟取整的规则有点联系。 py2.7 里似乎是向负无穷取整的

    -21/4 == -6
    -(21/4) == -5
    -21/4 == -(21/4) //False
    

    因为既然定义了 int,那除不尽的时候肯定要设定一个取整规则,那 C++是向 0 取整的,py2.7 似乎是是向负无穷取整的,py3 结果是浮点数没有这个问题。

    我的问题是: 1.取整规则跟余数的选择不同是不是一个因果关系? 2.假设 1 成立(其实我心里已经默认是了 T-T ),接着问为什么 py2.7 要搞这个向负无穷取整,搞得-21/4==-(21/4)都不相等了,书上还说

    C++语言的早起版本允许结果为负值的商向下或向上取整。 (为什么一开始会是这种设定?)

    (看了下 js,没有这个问题,跟 py3 一样是浮点数,但 js 跟 C++一样余数也是跟被除数符号一样的,php 也是)。

    stackoverflow 链接

    8 条回复    2017-11-09 20:07:22 +08:00
    GtDzx
        1
    GtDzx  
       2017-11-09 19:02:08 +08:00   ❤️ 1
    1. 是的。Python 是向负无穷取整,C/C++/Java 是向 0 取整。
    GtDzx
        2
    GtDzx  
       2017-11-09 19:04:27 +08:00   ❤️ 1
    2. Python 这么设计的原因是假设 a/b 商是 q,余数是 r,那么应该有 a = bq + r。 向负无穷取证可以保证 r 是非负的,向 0 取整会导致 r 是负的。
    anmaz
        3
    anmaz  
       2017-11-09 19:05:33 +08:00 via Android
    2 和 3 是有区别的,本身 python 对算术运算就有一些特殊的需求
    rebeccaMyKid
        4
    rebeccaMyKid  
    OP
       2017-11-09 19:15:52 +08:00
    @GtDzx 可是向负无穷取整,python 的余数不也是负的么? 21%-4 在 py2.7 的结果里是-3 啊。。
    rebeccaMyKid
        5
    rebeccaMyKid  
    OP
       2017-11-09 19:17:28 +08:00
    GtDzx
        6
    GtDzx  
       2017-11-09 19:25:49 +08:00
    @rebeccaMyKid 哦,上面说的是针对 b 是正数。如果考虑 b 是负数,Python 是这么规定的:
    1. a = bq + r,其中 q = a // b, r = a % b
    2. r 和 b 符号相同
    rebeccaMyKid
        7
    rebeccaMyKid  
    OP
       2017-11-09 19:32:19 +08:00
    @GtDzx 所以当 b 是负值的时候,r 还是负的,那这样向负无穷取整没啥意义啊。只让 b 为正,即使 a 为负的时候,r 能正,这个有什么特别意义么
    rebeccaMyKid
        8
    rebeccaMyKid  
    OP
       2017-11-09 20:07:22 +08:00 via Android
    @GtDzx 看懂文章了,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:59 · PVG 22:59 · LAX 06:59 · JFK 09:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.