c++ - 为什么我的 double 或 int 值在除法后总是 0?

标签 c++ division integer-division

我是 C++ 的新手,我在为某些图像编辑软件编写的百分比增加方法中遇到了一些奇怪的行为。

我想要做的是给出当前像素的 R G 或 B 值并将其除以某个修饰符,然后将其乘以新值以返回增加的百分比,相当简单的概念。

但是,每当我运行我的调试器时,返回值始终为 0,我认为这可能是因为我正在尝试对整数进行负数运算(或者可能发生被零除?),所以我尝试使用 double 来存储计算的输出,但是我运气不好。

我正在努力处理的代码如下:

int Sliders::getPercentageIncrease(int currPixel, int newValue, int modifier)
{
    // calculate return value
    double returnVal = (currPixel / modifier) * newValue;

    // Check we are returning a positive integer
    if(returnVal >= 0)
        return (int)returnVal;

    // Return a negative integer value
    return (int)(0 - returnVal);
}

我在这里做错了什么?

注意:我已经检查了调试器中的输入值,我得到了如下内容:

currPixel = 30
newValue = 119
modifier = 200

据此我期望输出为 18(我不关心返回十进制数字)

最佳答案

您当前的计算仅涉及整数,因此会受到整数除法(将结果截断为最接近的整数值)的影响。

(currPixel / modifier) * newValue
     |           |
      ---------------integer division e.g. 10/3 = 3, not 3.333

然后将结果转换为 double,但在此之前准确性会丢失。

考虑以下几点:

#include <iostream>
using namespace std;

int main() {
    int val1 = 10;
    int val2 = 7;
    int val3 = 9;

    double outval1 = (val1 / val2) * val3;
    double outval2 = ((double)val1 / val2) * val3;
    cout << "without cast: " << outval1 << "\nwith    cast: "<< outval2 << std::endl;

    return 0;
}

这个的输出是:

without cast: 9
with    cast: 12.8571

See it here

请注意,强制转换必须应用在正确的位置:

(double)(val1 / val2) * val3 == 9.0      //casts result of (val1/val2) after integer division
(val1 / val2) * (double)val3 == 9.0      //promotes result of (val1/val2) after integer division
((double)val1 / val2) * val3 == 12.8571  //promotes val2 before division
(val1 / (double)val2) * val3 == 12.8571  //promotes val1 before division

由于其他操作数的提升,如果有疑问,您可以转换所有内容,结果代码将是相同的:

((double)val1 / (double)val2) * (double)val3 == 12.8571  

虽然有点冗长。

关于c++ - 为什么我的 double 或 int 值在除法后总是 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26650870/

相关文章:

c++ - 这么复杂的C++类设计的目的是什么?

c++ - 在 win7-64 位中通过 mingw 使用 boost.python 编译一些代码

c++ - C++ 中的除法汇总

java - JavaME 函数帮助

c++ - 不同类(class)成员的比较器

c++ - 为什么这个表达式没有正确评估?

python - 在 Python 中,整数除法中向零舍入的好方法是什么?

html - 如何解决并排放置 div 的移动问题?

c - 如何在 C 中划分愚蠢的大数

python - 整数除法四舍五入