C ++将浮点值限制在十分位置?

时间:2015-02-25 01:12:41

标签: c++ variables floating-point

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

我几乎在那里,但是,我现在有一个我要删除的尾随零。

2 个答案:

答案 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;
}

应该有效,但您仍需要添加负数的检查。