7

基本上我有两个变量:

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

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

4

3 回答 3

15

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

 double intpart;

 if( modf( halfWidth, &intpart) == 0 )
 {
 // your code here
 }
于 2013-05-14T02:00:05.777 回答
2

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

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

因为其中一个操作数是双精度数(即2.0),这将强制编译器在进行数学运算之前将其转换WidthHeight双精度数(假设它们还不是doubles)。转换后,除法将以双精度浮点数进行。所以它会有一个小数,在适当的地方。

下一步是简单地检查它modf

double temp;
if(modf(halfWidth, &temp) != 0)
{
  //Has fractional part.
}
else
{
  //No fractional part.
}
于 2013-05-14T02:08:57.580 回答
2

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

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

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

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

于 2020-02-20T08:50:23.077 回答