我是 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
请注意,强制转换必须应用在正确的位置:
(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/