float Vout, Tav, To, TempValue;
Vout = sensor.Sense(); // Sample data (read sensor)
Tav = sensor.GetAverageTemp(); // Calculate average temperature from N samples
To = sensor.GetLatestTemp(); // Calculate temperature from the latest sample
TempValue = sensor.GetAverageTemp();
pc.printf("Temp Value: %.1f", TempValue);//<-- Outputs Temp Value: 25.6
printf
成功将值输出到十分之一。如何在C ++中将值保存到TenVs变量的TempValue变量?
我试图使用floor():
TempValue = sensor.GetAverageTemp();
pc.printf("Temp Value before floor: %f\n\r", TempValue);
TempValue = floor(TempValue*100)/100;
pc.printf("Temp Value after floor: %f\n\r", TempValue);
该代码导致:
楼前温度值:25.731195
楼层后温度值:25.730000
我几乎在那里,但是,我现在有一个我要删除的尾随零。
答案 0 :(得分:3)
你几乎可以肯定地解决了错误的问题。
将浮点值舍入到某个小数位数很少有意义。您可以执行一些算术来获取值24.822018
并生成24.8
的近似近似,但由于浮点(通常)以二进制形式存储,因此它可以&#39 ; t完全代表24.8
。实际存储的值可能类似于
24.800000000000000710542735760100185871124267578125
您已经知道如何打印一个截断到指定小数位数的浮点值(使用printf
格式为"%.1f"
- 或者您可以使用std::setprecision
,因为您正在询问C ++。 (但std::setprecision
指定总位数,而不是小数点后的位数。)几乎在所有情况下,在准备打印数字之前截断数字没有任何好处。
答案 1 :(得分:0)
我相信您正在寻找iomanip的std::setprecision
。
示例用法是:
std::cout << std::setprecision(2) << TempValue << std::endl;
但是,如果您尝试对变量进行舍入,则可以使用以下内容:
void round_to_tenths(float &f) {
uint32_t val = (uint32_t) f;
float dec = f - val;
uint32_t sd = (uint32_t)(dec * 100);
f = val;
uint8_t tmp;
uint32_t test = sd % 10;
sd /= 10;
if (test >= 5) {
tmp = sd % 10 + 1;
} else {
tmp = sd % 10;
}
f += (float) tmp / 10;
}
应该有效,但您仍需要添加负数的检查。