代码之家  ›  专栏  ›  技术社区  ›  Alexander Stolz

C++计算评估为0

  •  1
  • Alexander Stolz  · 技术社区  · 16 年前

    结果是这个代码的值是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 回复  |  直到 16 年前
        1
  •  7
  •   Mike Seymour    16 年前

    • 换算系数为10(180/2 23 约为2.145767*10 -5 ,你有2.145767*10 )
    • 当你应该除以换算系数时,你是在乘以换算系数。这将给你一个非常小的数字,和演员 int 会给你零分。
        2
  •  7
  •   IVlad    16 年前

    你把它转换成int,这意味着你只得到了不可分割的部分。

    (int)0.7 == 0 . 如果强制转换为int的表达式是<1,由于施法,结果将为0。自 2.145767 * 0.0001

    考虑专门使用float或double。

    一般来说:

    (int)x.y == x 所有花车和双人 x.y . (忽略可能的溢出)

        3
  •  4
  •   warrenm    16 年前

    int ,这些值将被截断为0。如果转换因子正确,则可能需要使用浮点类型来表示结果。

        4
  •  4
  •   Potatoswatter    16 年前

    vector<string> argv;
    

    并以某种方式初始化了它。

    string::data 不能保证以null结尾。

    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);
    
        5
  •  -1
  •   Thorsten79    16 年前

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

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