Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中截断十进制值 最简单的方法是截断一个值为0.6000002的C++浮点变量,并将其存储在变量中,首先要知道浮点数是近似的。请参阅@Greg Hewgill提供的链接,了解此问题无法完全解决的原因_C++_Decimal_Truncate - Fatal编程技术网

在C++中截断十进制值 最简单的方法是截断一个值为0.6000002的C++浮点变量,并将其存储在变量中,首先要知道浮点数是近似的。请参阅@Greg Hewgill提供的链接,了解此问题无法完全解决的原因

在C++中截断十进制值 最简单的方法是截断一个值为0.6000002的C++浮点变量,并将其存储在变量中,首先要知道浮点数是近似的。请参阅@Greg Hewgill提供的链接,了解此问题无法完全解决的原因,c++,decimal,truncate,C++,Decimal,Truncate,但以下是一些可能满足您需求的解决方案: 可能是更好但效率更低的方法: char sz[64]; double lf = 0.600000002; sprintf(sz, "%.4lf\n", lf); //sz contains 0.6000 double lf2 = atof(sz); //lf == 0.600000002; //lf2 == 0.6000 printf("%.4lf", lf2); //print 0.6000 更有效但可能不太精确的方法: double lf =

但以下是一些可能满足您需求的解决方案:

可能是更好但效率更低的方法:

char sz[64];
double lf = 0.600000002;
sprintf(sz, "%.4lf\n", lf); //sz contains 0.6000

double lf2 = atof(sz);

//lf == 0.600000002;
//lf2 == 0.6000

printf("%.4lf", lf2); //print 0.6000
更有效但可能不太精确的方法:

double lf = 0.600000002;
int iSigned = lf > 0? 1: -1;
unsigned int uiTemp = (lf*pow(10, 4)) * iSigned; //Note I'm using unsigned int so that I can increase the precision of the truncate
lf = (((double)uiTemp)/pow(10,4) * iSigned);

实际上这是不可能的。它不是C++的限制,而是浮点工作的方式。对于许多值,没有精确的表示形式,因此不能简单地截断为若干位数

使用printf格式字符串打印时可以截断


如果您确实需要只存储有限数量的数字,我建议您改用固定精度的数据类型。

大卫·戈德伯格(David Goldberg)提供了一个很好的参考资料。

我认为这里应该问的问题是: 你为什么需要它

<>如果要比较值,也许你应该考虑使用ε检验。在你的例子中,有一个额外的公差值,因为它似乎远远大于普遍接受的ε

如果您只是想将其打印为0.6000,请使用其他人建议的方法

roundf(myfloat * powf(10, numDigits)) / powf(10, numDigits);
例如,在您的例子中,您正在截断三位数numDigits。您可以使用:

roundf(0.6000002 * 1000) / 1000
// And thus:
roundf(600.0002) / 1000
600 / 1000
0.6
您可能会将powf的结果存储在某个地方,因为您使用了它两次

由于浮点数通常存储在计算机上,因此可能存在不准确的情况。不过,这就是使用浮动所得到的结果。

使用以下方法:

floor(0.6000002*10000)/10000

以下是使用其他答案中建议的函数及其使用示例:

#include <iostream>
#include <cmath>

static void Truncate(double& d, unsigned int numberOfDecimalsToKeep);

int main(int, char*[])
{

  double a = 1.23456789;
  unsigned int numDigits = 3;

  std::cout << a << std::endl;

  Truncate(a,3);

  std::cout << a << std::endl;

  return 0;
}

void Truncate(double& d, unsigned int numberOfDecimalsToKeep)
{
    d = roundf(d * powf(10, numberOfDecimalsToKeep)) / powf(10, numberOfDecimalsToKeep);
}

与其他答案类似,但您不能忘记圆形、地板和trunc在定义上是不同的。请参见以下内容的定义和输出示例:

在这种情况下,我们需要以4位小数的精度进行计算,并去掉不重要的小数:

trunc(valueToTrunc*10000)/10000

对于C++11,可以使用标头中定义的std::round:

您可以使用以下选项:

int n = 1.12378;
cout << fixed << setprecision(4) << n;
输出将为:1.1238

不是:1.1237

它只是最后一个十进制数,不是全部:12.123447==>12.1234


小心点…

谢谢你发布链接Greg,我在写答案时正想着那份文件,但我一辈子都记不起标题了。
auto trunc_value = std::round(value_to_trunc * 10000) / 10000;
int n = 1.12378;
cout << fixed << setprecision(4) << n;