我对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 修饰符= 200
从此我可以预期输出为18(我不关心返回十进制数字)
答案 0 :(得分:2)
由于所有三个参数都是整数计算结果
double returnVal = (currPixel / modifier) * newValue;
将永远被截断。添加转换为(double),结果应该没问题。简单地:
double returnVal = ((double)currPixel / modifier) * newValue;
如果你只在括号前设置一个强制转换,则除法的结果保持整数。
答案 1 :(得分:1)
您当前的计算仅涉及整数,因此会受整数除法的影响(将结果截断为最接近的整数值)。
(currPixel / modifier) * newValue
| |
---------------integer division e.g. 10/3 = 3, not 3.333
然后将结果转换为加倍,但在此之前准确性会丢失。
请考虑以下事项:
#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
虽然更加冗长。
答案 2 :(得分:0)
只要所有值都在一个范围内,让我说,小于1000且大于(或等于)0,这在颜色值上很常见,可以这样做
int returnVal = (currPixel * newValue) / modifier
不需要双打;它甚至会加速代码。
不用说,modifier
不应该为零。
答案 3 :(得分:0)
这样做:
// calculate return value
double returnVal = (static_cast<double>(currPixel) / modifier) * newValue;
或者这个:
double returnVal = (currPixel / static_cast<double>(modifier)) * newValue;
如您所知,operator /
将首先执行,然后执行operator *
。我已将/
到double
的操作数之一进行了类型转换,因此将执行除法double
。现在,*
的左操作数将为double
(因为/
生成double
),并且乘法也将执行double
。为了清楚和正确,您可以写:
double returnVal = (static_cast<double>(currPixel) / static_cast<double>(modifier)) * static_cast<double>(newValue);
或者简单地说:
double returnVal = (double(currPixel) / (double)modifier) * (double)newValue;
但是,以下是错误的:
double returnVal = (double)(currPixel / modifier) * /*(double)*/ newValue;
由于除法仅执行int
!它就像:
double x = 10/3;
您需要的地方:
double x = 10.0/3;
double x = 10/3.0;
double x = (double)10/3;
答案 4 :(得分:0)
转换为double应修复错误。
double returnVal = (double ) (currPixel) / (modifier) * newValue;
请参阅类型转换规则typecasting rules in c。