区分具有小数位的数字(double类型)和不带-c ++的数字

时间:2011-03-24 10:30:10

标签: c++ integer double rounding

我试图在c ++中实现一个简单的抽取算法。我有两个数组,比如p& q,其中下标通过以下关系相互关联:

p[k] = q[0.5*k]。这意味着以下序列应保持有效:

p[0] = q[0]  
p[1] = 0  
p[2] = q[1]  
p[3] = 0  
p[4] = q[2]  

依旧......

请注意,p[k]仅取值,且仅当(0.5*k)的结果不包含小数位(或十进制为0)且不使用任何四舍五入等时

我的问题是:有没有办法区分一个整数(一个没有小数位的数字或只有十进制的0,比如说2.0)和一个带有小数位的数字,只要两者都有被抛到一倍?

例如。) 2.0是一个加倍的整数。 2.1是带小数位的数字。
例如。 2)* 0.9 * 2应该将0放入数组p而0.9 * 10应该将q [9]放入数组p。*

如果我使用语句(int) (0.5*k),那么无论k的值如何,我都会在每种情况下都得到一个整数。

修改:上述情况中的0.5只是说明性的。它可以是任何数字,例如2,2.5,0.9,0.95等。)

非常欢迎任何帮助,
谢谢,
斯利拉姆。

6 个答案:

答案 0 :(得分:3)

假设k是整数类型,您可以使用if (k % 2 == 0) ...检查k是否可以被2整除:

if (k % 2 == 0)
  p[k] = q[k / 2];
else
  p[k] = 0;

这也可以使用三元运算符表示:

p[k] = (k % 2 == 0) ? q[k / 2] : 0;

答案 1 :(得分:2)

假设coef可以是其他任何东西,

p[floor(coef*k)] = (fabs(coef*k-floor(coef*k))<1E-6)?q[k]:0;

答案 2 :(得分:1)

您想要做的简短语法可能是:

p[k] = k % 2 ? 0 : q[k/2];

  

有没有办法区分C ++中的整数和整数?

定义整数,并在此上下文中定义整数。我很困惑!

您是否正如here?

所解释的那样

如果你想检测一个数字是否是整数,那么这可能会有所帮助:

#include<cmath>

bool IsInteger(double d)
{  
    double intpart;
    return std::modf(double number, &intpart) == 0.0;
}

答案 3 :(得分:1)

k%2在这个帖子中有几个答案。

但是,这对回答OP的问题没有用。注意编辑: “编辑:上述案例中的0.5只是说明性的。它可以是任何数字,例如2,2.5,0.9,0.95等。”

k%2仅有效,因为所选值为0.5。任何其他价值观都不适用。

因此,除非我完全遗漏了一些东西,否则我能想到的最简单的方法如下:

从数字本身中减去数字的下限。如果结果是> 0,它不是整数。

答案 4 :(得分:0)

除非您的表达式导致数字不合理,否则您可以使用Boost.Rational来表示您的行为。

答案 5 :(得分:0)

@ Aix对k%2的建议看起来好像与?:运算符完美结合:

p[k] = (k%2) ? 0 : q[k/2];