目录
求余或求模有负数参与, 不同语言结果不同?
不止是除法,求余或求模一旦有负数参与,结果可能都有差异。本质在于不同语言使用不同求余规则。
- 向零取整
向 0 方向取最接近精确值的整数,C/ObjC/C++/Rust/C#/Java/Go/Swift/JS/VB/仓颉/PHP/Kotlin 等语言都采用这种方式。- 按此规则,被求模的数值是负数,求模的数值也是负数。
- 向下取整
向负无穷方向取最接近精确值的整数,Python采用这种方式(Python2/3都遵循)。 - 向上取整
向正无穷方向取最接近精确值的整数。
所以问题就简单了:
- C语言
9 / -4 == -2.25, 向0取整得到结果-2,推算9 % -4 == 9 - (-2 * -4) == 1. - Python
9 / -4 == -2.25, 向下取整得到结果-3,推算9 % -4 == 9 - (-3 * -4) ==-3.
标准文档的规定
- C语言C89规定,当除数和被除数有负数时,商和余数的符号是未定义行为。C99开始,此行为被约束为固定行为,即向零取整。
- C89 6.3.5章节:"If either operand is negative. whether the result of the / operator is the
largest integer less than or equal to the algebraic quotient or the smallest integer greater than or equal to the algebraic quotient is implementation-defined." - C99 6.5.5章节:"When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.”
- C89 6.3.5章节:"If either operand is negative. whether the result of the / operator is the
特殊的求模
- VB 语言用浮点数求模,会先把浮点数转换成整数再求模:
12.5 Mod 4.6 等价于 12 Mod 4, 得到3.
编程语言运算符
不支持运算符的编程语言应该没有人会用,包括汇编语言都是用指令代替了运算符。定义基本的运算符如下:+ - * / %
基本运算符支持
- C/ObjC/C++/Java/C#/Python/JS/Rust/Go/Swift/仓颉/VB/Fortran/PHP/Kotlin 等均支持。
- Python “/”代表全除,"//"代表整除。
- Pascal 不支持 % , 运算符 / 代表实数运算而非整数运算,div 用于整数除法,mod 整数求余。
优先级
- * / % 优先级相同,左结合,都比 + - 优先级高。
- + - 优先级相同,左结合。
除0
- C# 整数除以0会有编译错误或运行时提示"DivideByZeroException",浮点数除以0会得到Infinity或-Infinity. 浮点数0除以0会得到NaN.
基本运算
编程语言基本数据类型的加减乘除,看起来都很像。它们都和数学公示很像,除了乘法不能用X或x,这个是字母,除法不能用÷,因为这个字符在键盘上看不到。
- + - * / %
- C/ObjC/C++/C#/Java/Python/Fortran/Ada/Ruby/JS/Rust/Go/Swift/仓颉/VB/Fortran/PHP/Kotlin 等均支持。
- VB 支持前四种,求模是用MOD而非%, VB "/" 特殊一些,代表浮点除。
- C/ObjC/C++/C#/Java/Python/Fortran/Ada/Ruby/JS/Rust/Go/Swift/仓颉/VB/Fortran/PHP/Kotlin 等均支持。
不同的除法
- Python “/”代表全除,"//"代表整除。
- VB "/" 代表浮点数除法,"\" 和C语言的整数除法一样。
除法的余数?
- C/ObjC/C++ 等语言的整数除法默认会丢弃余数,Java/C#一样。
- Python提供/和//分别代表不舍弃和舍弃的除法,更加清楚。当然,Python是脚本类语言,/ 运算得到最精确的结果是符合预期的。
- 注意 "//" 是Python 2.2版本开始支持。
- ML语言用div和/区分出整数除法和浮点数除法,清晰度也很高。
求幂
- 大部分编程语言都不支持求幂,因为它不常用,不作为首选。
C/ObjC/C++/C#/Java 等均没有求幂运算符。 - Fortran/Ada/Ruby/VB/Python 有求幂运算符,VB用^, Fortran/Ada/Ruby/Python用**.
- Python的幂运算符优先级最高。
求模
- 大部分C系编程语言用%作为求模,且必须是整型变量,不能有浮点数。
- VB用MOD求模。
- C语言浮点数求模用fmod标准函数。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。