C++计算评估为0

C++计算评估为0,c++,double,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.

我正在分析一个文件并试图将坐标解码到正确的单位。 发生的情况是,此代码的计算结果为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。这段代码有什么问题吗?

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

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

最终将转换为int,这将把所有值限制为较小值!int值。在这种情况下,C不四舍五入


[编辑:抱歉,我以前版本的答案包含错误的部分。]

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


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

您将其转换为int,这意味着您只接受完整部分

int0.7==0。如果强制转换为int的表达式小于1,则由于强制转换,结果将为0。由于2.145767*0.0001是一个非常小的数字,因此发生这种情况的可能性非常高

考虑专门使用浮点或双精度浮点

一般而言:


intx.y==x表示所有浮点数和双精度x.y。忽略可能的溢出

您将其强制转换为int,这意味着您只接受整数部分

int0.7==0。如果强制转换为int的表达式小于1,则由于强制转换,结果将为0。由于2.145767*0.0001是一个非常小的数字,因此发生这种情况的可能性非常高

考虑专门使用浮点或双精度浮点

一般而言:


intx.y==x表示所有浮点数和双精度x.y。忽略可能的溢出

我现在假设您已经定义了

vector<string> argv;

我现在假设你已经定义了

vector<string> argv;

假设尝试将角度转换为WGS84坐标,则会出现两个错误:

换算系数为10 180/223,约为2.145767*10-5,即2.145767*10-4 当你应该除以换算系数时,你是在乘以换算系数。这将给你一个非常小的数字,转换为int将得到零。
假设尝试将角度转换为WGS84坐标,则会出现两个错误:

换算系数为10 180/223,约为2.145767*10-5,即2.145767*10-4 当你应该除以换算系数时,你是在乘以换算系数。这将给你一个非常小的数字,转换为int将得到零。
argv是一个向量吗?结果总是0,还是只针对argv的某些值?如果不知道argv的值,就不可能说出它的计算结果。argv通常用于表示给定给程序的命令行参数,但显然不是在这种情况下。如果您能向我们展示定义和一些示例值,我们可以更好地帮助您。看起来您正在尝试将度数转换为WGS84坐标,但使用乘法而不是除法,这将产生一个非常小的结果,除了错误之外,它将舍入为零。argv是向量吗?结果是否始终为0,或者只针对argv的某些值?如果不知道argv的值,就不可能说出它的计算结果。argv通常用于表示给定给程序的命令行参数,但显然不是在这种情况下。如果您可以向我们展示定义和一些示例值,我们可以更好地帮助您。看起来您正在尝试将度数转换为WGS84坐标,但使用的是乘法而不是除法,这将产生一个非常小的结果,除了错误之外,它将舍入为零。>整个计算以整数格式完成。这不是问题。int在需要时被提升为float-这是由语言明确定义的。>在C中,1*0.1和1.0*0.1之间存在差异。有什么区别?这两种方法都会导致浮点运算,因为整型运算由运算符*>提升为浮点运算,整个计算以整型格式完成。这不是问题。int在需要时被提升为float-这是由语言明确定义的。>在C中,1*0.1和1.0*0.1之间存在差异。有什么区别?这两个结果都是float,因为整数被操作符*提升为float。看起来从秒到十进制度数的转换也被关闭了10倍,36000而不是3600。36000是正确的,我得到度数,分和10秒。但其余的都错了,现在可以工作了。使用atoi的代码在一般情况下不能也不会工作。工作中的任何相似之处都是暂时的,纯粹是偶然的
从秒到十进制度数的转换也是10,36000而不是3600。36000是对的,我得到度数,分和10秒。但其余的都错了,现在可以工作了。使用atoi的代码在一般情况下不能也不会工作。工作的任何相似之处都是暂时的,纯属偶然。