我正在解析文件并尝试将坐标解码到正确的单位。 会发生什么是这个代码被评估为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。这段代码有问题吗?
答案 0 :(得分:7)
您正在将其强制转换为int,这意味着您只是将其作为整体部分。
(int)0.7 == 0
。如果转换为int的表达式是< 1,由于演员,结果将为0。由于2.145767 * 0.0001
是一个非常小的数字,所以发生这种情况的可能性非常高。
考虑专门使用浮动或双打。
一般来说:
所有浮点数和双打(int)x.y == x
的 x.y
。 (忽略可能的溢出)
答案 1 :(得分:7)
假设您正在尝试将度数转换为WGS84坐标,则有两个错误:
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不会舍入。
[编辑:对不起,我之前的这个答案版本包含了错误的部分。]