原因在于/
操作员如何使用特定类型.
除法运算x/y
作为整数除法执行,因为两个操作数都是整数类型.因此,结果值具有截断的小数部分.
因此,乘以该结果y
将不一定x
与截断结果值相同.这个结果和之间的区别x
是x%y
.
根据C标准第6.5.5节:
6 当整数被划分时,
/
运算符的结果是代数商,丢弃任何小数部分. 如果商a/b
是可表示的, 则表达式(a/b)*b + a%b
应相等a
; 否则,双方的行为a/b
和a%b
不确定.
因此标准明确规定这种平等成立.
如果除法的任一操作数是浮点类型,则x-(x/y)*y
由于浮点运算的不精确性,它将始终为0或非常接近0的值.
原因在于/
操作员如何使用特定类型.
除法运算x/y
作为整数除法执行,因为两个操作数都是整数类型.因此,结果值具有截断的小数部分.
因此,乘以该结果y
将不一定x
与截断结果值相同.这个结果和之间的区别x
是x%y
.
根据C标准第6.5.5节:
6 当整数被划分时,
/
运算符的结果是代数商,丢弃任何小数部分. 如果商a/b
是可表示的, 则表达式(a/b)*b + a%b
应相等a
; 否则,双方的行为a/b
和a%b
不确定.
因此标准明确规定这种平等成立.
如果除法的任一操作数是浮点类型,则x-(x/y)*y
由于浮点运算的不精确性,它将始终为0或非常接近0的值.