我想将浮点数截断为4位数。 有没有一种有效的方法呢? 我目前的解决方案是:
double roundDBL(double d,unsigned int p=4)
{
unsigned int fac=pow(10,p);
double facinv=1.0/static_cast<double>(fac);
double x=static_cast<unsigned int>(d*fac)*facinv;
return x;
}
但使用pow
和删除似乎并不那么有效。
亲切的问候
阿尔曼。
答案 0 :(得分:4)
round(d*10000.0)/10000.0;
或者p必须是可变的;
double f = pow(10,p);
round(d*f)/f;
round
通常被编译为单个指令,比转换为整数并返回更快。要验证的配置文件。
请注意,double
可能无法准确表示4位小数。您将无法真正截断任意双精度,只需找到最接近的近似值。
答案 1 :(得分:2)
效率取决于您的平台。
无论您尝试何种方法,都应该进行分析以确保
您可以乘以10000,截断为整数,然后再划分。在double和int之间进行转换可能会更快或更慢。
您可以截断输出,例如printf
格式字符串"%.4f"
答案 2 :(得分:1)
您可以使用更高效的基于整数的变体替换pow
。 Stack Overflow上有一个:The most efficient way to implement an integer based power function pow(int, int)
此外,如果您可以接受一些不准确,请用乘法替换除法。分裂是最慢的常见数学运算之一。
除此之外,我会回应其他人所说的内容并简单地截断输出,除非你实际上需要在计算中使用截断的双精度。
答案 3 :(得分:1)
如果您需要执行涉及十进制数字的精确计算,请立即停止使用double
!它不适合您的数据类型。你不会获得实际舍入的十进制值。几乎所有的值(截断后,无论你使用什么方法)实际上都是1,000999999999999841,而不是1,0001。
那是因为double
是使用binary fractions实现的,而非十进制的。{1}}。您可以使用decimal types来正确使用它。它们会慢得多,但是如果结果不需要正确的话,我知道一种让它无限快速的方法......