当前位置:  开发笔记 > 编程语言 > 正文

在C++中截断十进制值

如何解决《在C++中截断十进制值》经验,为你挑选了3个好方法。

截断float值为0.6000002且值为0.6000 的C++ 变量并将其存储回变量的最简单方法是什么?



1> Greg Hewgill..:

关于为什么会发生这种情况的一个很好的参考可以在David Goldberg的"每个计算机科学家应该知道的关于浮点算术的内容"中找到.



2> Brian R. Bon..:

首先,重要的是要知道浮点数是近似的.请参阅@Greg Hewgill提供的链接,了解为什么此问题无法完全解决.

但是这里有几个可能满足您需求的问题的解决方案:

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

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);



3> Kamil Kisiel..:

实际上,这是不可能的.这不是C++的限制,而只是浮点的工作方式.对于许多值,没有精确的表示,因此您不能简单地截断为多个数字.

使用printf格式字符串打印时可能会截断.

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

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有