代码之家  ›  专栏  ›  技术社区  ›  void.pointer

将浮点型强制转换为int型的算术最佳方法是什么?

  •  2
  • void.pointer  · 技术社区  · 15 年前

    在C中,我正在做这样的事情:

    float a = 4.0f;
    float b = 84.5f;
    int ans = a * b;
    

    但是,编译器声明,在赋值中,强制转换必须从float->int开始。当然,我可以这样做:

    int ans = (int)a * (int)b;
    

    但这是丑陋和多余的。有更好的方法吗?我知道C++可以做到这一点:

    int ans = int(a * b);
    

    至少在眼睛上看起来好一点。但我不能在C里这样做。

    5 回复  |  直到 15 年前
        1
  •  9
  •   David Basarab    15 年前

    在查看代码之前,您应该考虑应用程序的需求。做 float 数学到 int 不可轻视。真正的问题是你在最后的答案中寻找什么。

    A被铸造成4,B被铸造成84,这是336的结果。但是,如果在计算完后将其强制转换为int,则结果是338。

    2点下班对你来说足够吗?那你就得这么做

    int ans = (int)a * (int)b;
    
    // ans = 336
    

    如果你想要338,你就得这么做。

    int ans = (int)(a * b);
    
    // ans = 338
    

    我真的会考虑你所做的事情的副作用。理想情况下,在进行数学运算之前,您应该有一个将2个浮点数四舍五入的策略。记住,转换为int只会减少一个小数。所以84.9变为84。这会极大地改变你的最终结果。您需要考虑在您的应用程序中需要什么。

        2
  •  3
  •   Brandon    15 年前

    int 也在括号中。

    int ans = (int)(a * b);
    
        3
  •  2
  •   cdonner    15 年前
     int ans = (int)a * (int)b; 
    
     int ans = (int)(a * b); 
    

    这两个语句是不等价的,将产生不同的结果。在一种情况下,在乘法之前放弃精度,在另一种情况下在乘法之后放弃精度。

        4
  •  1
  •   user180326    15 年前

    尝试 int ans = (int)(a * b);

        5
  •  1
  •   D'Arcy Rittich    15 年前
    int ans = (int)(a * b);
    
    推荐文章