C:为什么我的输出没有使用 math.h 中的 round() 函数进行舍入?

问题描述 投票:0回答:2

我正在编写一个灰度函数,我正在使用

round()
来舍入 RGB 颜色的平均值,但是在测试它时,舍入函数不会舍入答案 > x.5,而是将所有内容舍入。

我尝试将我的 int avg 更改为 float avg 并使用

round()
,但没有用。我尝试使用
roundf()
,没有用。例如,当红色、绿色和蓝色的值为 27、28、28 时,我得到平均 27 而不是正确的 28。

我的代码:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    int avg = 0;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            avg = round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3);
            image[i][j].rgbtRed = avg;
            image[i][j].rgbtGreen = avg;
            image[i][j].rgbtBlue = avg;
        }
    }
    return;
}
c rounding
2个回答
2
投票

在 C 中,操作是使用取决于操作数的类型执行的。对于整数操作数,使用整数类型。

(image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3
中,所有操作数都是整数,因此使用整数类型(在本例中为
int
)进行运算。这个表达式是
round
的子表达式,它接受一个
double
,这一事实并不影响这个子表达式的计算。这个子表达式使用
int
算术求值,然后将结果转换为
double
传递给
round
.

不需要用

round
取整。由于这些值都是非负整数,因此它们的和有 0、1 或 2 模 3 的余数。如果您在除以 3 之前简单地在总和上加 1,您将得到一个四舍五入的结果:

avg = (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue + 1) / 3;

1
投票
round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3)

你加在一起的值都是整数。然后你除以一个整数。在调用

round
之前,结果是一个整数。当调用
round
时,
27
变为
27.0
,但这只是四舍五入到
27
.

在您的示例中,27 + 28 + 28 = 83。83 / 3 是 27.666...7。但是整数数学不考虑小数部分所以你得到 27.

简单的解决方案:除以浮点数。

round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0)

你现在将从除法中得到一个可以四舍五入的浮点数。

© www.soinside.com 2019 - 2024. All rights reserved.