显示0.999为0.99

时间:2010-10-20 00:52:46

标签: c++

如何将float number = 0.999显示为0.99

以下代码会不断打印1.00?我以为使用setprecision(2)指定小数点后的位数?

#include <iostream>
#include <iomanip>

using namespace std;


int main(int argc, char** argv) 
{     
  const float numberToDisplay = 0.999;
  cout << setprecision(2) << fixed << numberToDisplay << endl;

  return 0;
}  

6 个答案:

答案 0 :(得分:13)

setprecision(2)将舍入到最接近的两位浮点数,在本例中为1.0。如果你想截断(即得到0.99),你总是可以将数字乘以100(即10 ^ [数字]),转换为int,然后将其分成浮点数。有点乱,但它完成了工作。

const float numberToDisplay = 0.999;
const float numberTruncated = (int)(numberToDisplay * 100) / 100.0;
// float numberTruncated is 0.99

答案 1 :(得分:4)

我会使用floorf,因为我觉得它比其他一些解决方案更能表达你的意图。

cout << setprecision(2) << fixed << floorf(numberToDisplay*100)/100 << endl;

答案 2 :(得分:2)

简单:0.999四舍五入到两位小数是1.00。

答案 3 :(得分:0)

执行此操作的一种方法是将原始值拆分为整数和小数部分,将小数部分乘以100(因为您只需要2位数),然后再将其拆分以仅得到该部分的“整数”部分数。它不是非常优雅,但确实有效:

#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

int main(int argc, char** argv) 
{
   const double numberToDisplay = 0.999;

   double origInteger;
   double origDecimal;

   modf(numberToDisplay, &origInteger);

   double decimal = numberToDisplay - origInteger;

   //prints .999 even if the number is 12.999
   cout << decimal << endl;

   //results in 99 in origDecimal
   modf(decimal * 100, &origDecimal);
   //integer + .99
   double final = origInteger + (origDecimal / 100);

   cout << final << endl;

   return 0;
}

编辑:转换为(int)比另一个答案中描述的要简单得多。

答案 4 :(得分:0)

好的,只是想分享一下我提出的解决方案:

以下是我解决问题的方法:

float const number = value / 1000.0f;
QString string     = QString::number(number, 'f', 3);
string.chop(1);

基本上,算法是:

  • 将浮点数转换为小数点后保留3位数的字符串
  • 切断字符串中的最后一个字符

这种方法的缺陷是切碎并且必须指定3。

我对100万和1千兆(10 ^ 9)使用相同的逻辑,我必须将精度值更改为6和9,并将切换值分别设置为4和7。

答案 5 :(得分:0)

另外一个扔掉那里:

#include <cmath>

std::cout << numberToDisplay - std::fmod(numberToDisplay, 0.01f) << std::endl;