c整数除法不返回正确的商
c integer division not returning correct quotient
我的代码(C语言)是这样的:
avg = round((r + g + b) / 3);
r = avg;
g = avg;
b = avg;
应该是做灰度图效果的。没有语法错误,但显然是 avg,当按上面显示的值 r
计算为 27,并且 g
和 b
都为 28 时,avg 发现它是 27。我知道它是 27.66666... 四舍五入后是 28。如果你能 either-or/both 向我解释为什么 round()
会发生这种情况,and/or 给我一个解决方案,非常感谢。
假设r
、g
、b
都是整数类型,表达式(r + g + b) / 3
执行整数除法,因为所有操作数都是整数类型。这意味着除法的任何小数部分都会被截断。
将表达式更改为:
(r + g + b) / 3.0
常量 3.0
的类型为 double
,因此这将执行浮点除法。然后四舍五入这个表达式的结果会给你想要的结果。
- 由于
r
之前缺少 (
,您的代码将无法编译。
- 您没有提供原始数据类型,所以我假设
int
。
- 将总和除以 3 执行整数除法,因此 27 是正确的。
- 你想要的是
round((r + g + b) / 3.0)
,它会将(r + g + b)
隐式转换为double
。
我的代码(C语言)是这样的:
avg = round((r + g + b) / 3);
r = avg;
g = avg;
b = avg;
应该是做灰度图效果的。没有语法错误,但显然是 avg,当按上面显示的值 r
计算为 27,并且 g
和 b
都为 28 时,avg 发现它是 27。我知道它是 27.66666... 四舍五入后是 28。如果你能 either-or/both 向我解释为什么 round()
会发生这种情况,and/or 给我一个解决方案,非常感谢。
假设r
、g
、b
都是整数类型,表达式(r + g + b) / 3
执行整数除法,因为所有操作数都是整数类型。这意味着除法的任何小数部分都会被截断。
将表达式更改为:
(r + g + b) / 3.0
常量 3.0
的类型为 double
,因此这将执行浮点除法。然后四舍五入这个表达式的结果会给你想要的结果。
- 由于
r
之前缺少(
,您的代码将无法编译。 - 您没有提供原始数据类型,所以我假设
int
。 - 将总和除以 3 执行整数除法,因此 27 是正确的。
- 你想要的是
round((r + g + b) / 3.0)
,它会将(r + g + b)
隐式转换为double
。