如何检查双精度是否有小数部分?

时间:2013-05-14 01:53:29

标签: c++

基本上我有两个变量:

double halfWidth = Width / 2;
double halfHeight = Height / 2;

当它们被2除以时,它们将是整数或小数。如何检查它们是整数还是.5?

3 个答案:

答案 0 :(得分:13)

您可以使用modf,这应该足够了:

 double intpart;

 if( modf( halfWidth, &intpart) == 0 )
 {
 // your code here
 }

答案 1 :(得分:1)

首先,您需要确保使用双精度浮点数学:

double halfWidth = Width / 2.0;
double halfHeight = Height / 2.0;

因为其中一个操作数是双精度数(即2.0),这将强制编译器在进行数学运算之前将WidthHeight转换为双精度数(假设它们为&#39) ;还没有double s。转换后,除法将以双精度浮点数完成。所以在适当的情况下它会有一个小数。

下一步是使用modf进行检查。

double temp;
if(modf(halfWidth, &temp) != 0)
{
  //Has fractional part.
}
else
{
  //No fractional part.
}

答案 2 :(得分:1)

您可以舍弃小数部分,然后使用floor()将结果与原始值进行比较:

if (floor(halfWidth) == halfWidth) {
    // halfWidth is a whole number
} else {
    // halfWidth has a non-zero fractional part
}

正如@DávidLaczkó正确指出的那样,它是比modf()更好的解决方案,因为不需要其他变量。

根据我的基准测试(Linux,gcc 8.3.0,优化-O0 ...- O3),在现代笔记本电脑和服务器处理器上,floor()调用比modf()消耗更少的CPU时间。启用编译器优化后,差异甚至不断扩大。可能是因为floor()只有一个参数时,modf()有两个参数。