不需要的舍入C ++

时间:2012-08-13 23:02:24

标签: c++ math rounding

我有以下等式:

//get thermistor resistor value
temp=(THERMISTOR_R0)/((temp2/temp)-1);

//get temperature value in Kelvins and convert to Celsiuis
temp=(THERMISTOR_BETA)/log(temp/(THERMISTOR_R0*exp((-THERMISTOR_BETA)/298)));
temp-=273;

desiredVoltage =((15700-(25*temp))/10);

THERMISTOR_R0THERMISTOR _BETA是不变的。

temptemp2desiredVoltage是unsigned int,在计算之前定义。

问题是,例如,当术语((temp2/temp)-1)低于1时,它会向下舍入为0.我想摆脱这种舍入,因为它会导致我的计算出现大问题。

我该怎么做?

3 个答案:

答案 0 :(得分:8)

它不是四舍五入,而是整数除法。如果/运算符的两个操作数都是整数类型,则C ++的行为是执行整数除法,它只保留结果的整数部分(这在某些算法中经常需要,因为它更快)。

要获得“常规”除法,请确保所涉及的操作数中至少有一个属于浮点类型(floatdoublelong double);您可以将此参数声明为FP类型

double temp2, temp;

要么在其中一个操作数前面贴一个演员。

temp=(THERMISTOR_R0)/((double(temp2)/temp)-1);

(请注意,如果temp仍然是整数类型,则会在截断时发生。)

最有可能的情况是,您只需将temptemp2声明为double(或float,如果您在资源紧张的环境中工作)

另外,在除以数字文字时,请记住,如果不写小数点,它将是int字面值,如果你写它,它将是double。例如,298int298.double,因此1/20,但1/2.为{{} 1}}。

答案 1 :(得分:2)

如果您想要浮点除法行为,请确保使用浮点类型。

答案 2 :(得分:0)

编译器将浮点值向下舍入。

通常,通过在转换为整数之前将值加0.5来解决此问题。您可能希望显式使用浮点值(或强制转换),然后在转换为整数之前将0.5添加到结果中。