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;
coutsetprecision(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有一些默认精度,所以默认情况下你不应该看到乱七八糟的部分。