C ++计算评估为0

时间:2010-05-06 13:30:02

标签: c++ double

我正在解析文件并尝试将坐标解码到正确的单位。 会发生什么是这个代码被评估为0.如果我在gdb中键入它,结果是正确的。

int pLat = (int)(
        (argv[6].data() == "plus" ? 1 : -1)
        * (     atoi(argv[7].data()) 
              + atoi(argv[8].data()) / 60. 
              + atoi(argv[9].data()) / 36000.)
        * 2.145767 * 0.0001);

我正在进行(度,分,秒)转换为wgs。这段代码有问题吗?

5 个答案:

答案 0 :(得分:7)

您正在将其强制转换为int,这意味着您只是将其作为整体部分。

(int)0.7 == 0。如果转换为int的表达式是< 1,由于演员,结果将为0。由于2.145767 * 0.0001是一个非常小的数字,所以发生这种情况的可能性非常高。

考虑专门使用浮动或双打。

一般来说:

所有浮点数和双打(int)x.y == x

x.y。 (忽略可能的溢出)

答案 1 :(得分:7)

假设您正在尝试将度数转换为WGS84坐标,则有两个错误:

  • 转换因子超出10倍(180/2 23 约为2.145767 * 10 -5 ,您有2.145767 * 10 - 4
  • 当你应该除以它时,你乘以转换因子。这将为您提供一个非常小的数字,而int的强制转换将为零。

答案 2 :(得分:4)

插入argv [6..9]的随机值似乎会产生小于1的数字。当转换为int时,这些值将被截断为0.如果您的转换因子是正确的,您可以需要使用浮点类型来表示结果。

答案 3 :(得分:4)

我现在假设您已经定义了

vector<string> argv;

并以某种方式初始化它。

string::data没有做你想要的。实际上,它几乎没有任何作用。它只返回一个指向字符串版本的const指针,不保证以空值终止。

要将string与字符文字进行比较,只需使用==

要将string传递给C函数,请使用string::c_str

并且,您将一个小数字放入int

double pLat = ( // use a floating-point type
        (argv[6] == "plus" ? 1 : -1) // compare string using ==
        * (     atoi(argv[7].c_str()) // get C string using c_str
              + atoi(argv[8].c_str()) / 60. 
              + atoi(argv[9].c_str()) / 36000.)
        * 2.145767 * 0.0001);

答案 4 :(得分:-1)

您最终将转换为int,这会将所有值限制为较小的(!)int值。在这种情况下,C不会舍入。

[编辑:对不起,我之前的这个答案版本包含了错误的部分。]