C++ 将0.999显示为0.99

C++ 将0.999显示为0.99,c++,C++,如何将浮点数=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) &

如何将
浮点数=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;
}  
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv)
{     
常量浮点数显示=0.999;
cout
setprecision(2)
将四舍五入到最接近的两位浮点数,在本例中为1.0。如果您想要截断(即得到0.99),您可以将该数字乘以100(即10^[num位]),转换为整数,然后将其重新划分为浮点。这有点麻烦,但可以完成任务

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

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

一种方法是将原始值拆分为整数和小数部分,将小数部分乘以100(因为您只需要两位数字),然后再次拆分,只得到该数字的“整数”部分。这不是非常优雅,但确实有效:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv)
{
常数双精度数字显示=0.999;
双原整数;
双源小数;
modf(数字显示和原始整数);
双十进制=数字显示-原始整数;
//即使号码是12.999,也打印.999

cout好的,我只是想和大家分享我想出的一个解决方案:

下面是我如何解决这个问题的:

float const number = value / 1000.0f;
QString string     = QString::number(number, 'f', 3);
string.chop(1);
基本上,算法是:

  • 将浮点数转换为小数点后保留3位的字符串
  • 从字符串中切掉最后一个字符
这种方法的缺陷是切割,必须指定3


我对一百万和千兆(10^9)也使用相同的逻辑,我必须将精度值分别更改为6和9,将切碎值分别更改为4和7。

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

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

cout再扔一个:

#include <cmath>

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


std::是不是像你要求的那样,在小数点后打印两位数字。按照所有正常惯例,0.999到1.00。为什么你希望它是0.99?因为0.999比0.99更接近1.00,所以我只需要打印0.99。还有打印0.99的方法吗?这些东西让我想念printfIs,STL t还提供了其他一些东西hat只保留0.99而不向上或向下舍入?因为我不喜欢这个解决方案,所以我向人们征求意见。QString::number是否舍入?如果是,如果值为0.9999怎么办?如果不是,为什么不使用2作为精度?好问题,Martinho。如果您没有指定足够的精度,QString会舍入。例如,如果我指定了
QString::number(数字,'f',2)和
number`是0.9999,它将四舍五入到1.0。你是说
变量是0.9999还是
数字
变量是0.9999?我假设你的意思是
数字
。如果
数字
是.9999,在
之后,切掉(1)
,字符串将是
9.99
,这是我想要的(小数点后2位)。我使用3作为精度,以防止在
为999.9f时将其四舍五入,然后使用
印章(1)
切掉第三个数字,这样小数点后就只有两个数字了。对,实际上,这会删除小数点后的第三个数字。为什么要将整数和小数部分分开?为什么不一次将整部分相乘、截断、除?如果浮点较大,乘以100可能会导致溢出。(是的……我知道这不是一个非常有说服力的论点)如果这个数字乘以100时足以溢出,那么得到小数部分是没有意义的,因为你没有那么高的精度。你应该保持
setprecision(2)
part.比如说,您试图将
0.019
显示为
0.01
。碰巧
0.01
不能用IEEE754浮点值表示,所以减法的结果永远不会是
0.01
。您可能会看到一些像0.0099999977648258209228515650这样的胡言乱语。@Martinho:您的示例有效对于我来说,没有设置精度(2)
,但是建议是+1。@Martinho:cout有一些默认精度,所以默认情况下你不应该看到乱七八糟的部分。