【问题标题】:Round decimal for a float number浮点数的四舍五入
【发布时间】:2015-05-12 10:58:46
【问题描述】:

在 VC++ 中,我有一个浮点数,比如 1.32544354353 即float num=1.32544354353; 我只想要点后的前 1 位数字。即 1.3(不是 1.300000000)。 我怎样才能得到这个? 请帮我... 如果他们是 Cocos2dx 中的解决方案,那就更好了(我希望在我的 cocos2d-x 游戏中使用它)

【问题讨论】:

    标签: c++ visual-c++ integer cocos2d-x-3.0


    【解决方案1】:

    答案取决于您希望结果是什么类型。

    如果你想得到float的结果,那么这是不可能的。从float 的角度来看,1.3 和 1.300000000 是完全相同的值,您不能拥有一个包含 1.3 而不是 1.300000000 的 float。您可以在这里做的是使用例如(int)(val*10)/10.0 删除多余的数字。 (但是,浮点数精度问题不会使结果恰好为 1.3,它将是 1.2999999982 或 1.3000000029 行,末尾带有一些随机数字。)

    如果你想要一个字符串(一般是指一个字符串)表示,那么你可以生成一个字符串 "1.3"。为此,请使用精度说明符 如"%.1f"std::setprecision(1)

    【讨论】:

    • 感谢您的回复。我想在 Cocos2dx 标签中显示它。所以最好输出为 std::string。请问如何为 std::string 变量分配“%.1f”?
    • @Tony,对于std::string 输出,更好的方法是使用std::stringstreamstd::setprecision(1),而不是"%.1f"
    【解决方案2】:

    试试类似的东西

    float val=1.32544;
    float num=(float)(((int)(val*10))/10.0);
    

    但要小心溢出。

    【讨论】:

    • 谢谢。但我得到 num 的值为 1.29999995!
    • 那就是浮点精度的问题。行'float val2 = 1.3;'也导致 1.29995。你必须使用双倍。
    【解决方案3】:

    试试这个:

    #include <math.h>
    
    float x= 1.32544354353;
    float f = roundf(x* 10) / 10;  
    

    如果您只是想打印它,那么您可以像这样简单地使用格式说明符:

    ("%.1f", 1.32544354353);
    

    double d = 1.32544354353;
    std::cout << std::fixed << std::setprecision(1) << d << std::endl;
    

    【讨论】:

    【解决方案4】:

    我想到的第一件事是您可以将其乘以 10(您将得到 13)然后将其转换为 int(因此点后不再有数字)然后将其除以 10 以浮动(您将得到 1.3 )

    【讨论】:

      【解决方案5】:
      char str[50];
      sprintf(str, "%.1f",1.324567);
      

      现在 str 有一个字符串 1.3

      【讨论】:

      • 嗯,这不是严格的四舍五入,您正在转换为字符串。你会怎么做才能有一个浮动值?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2011-12-27
      • 2016-04-21
      • 2013-12-28
      • 2016-04-13
      相关资源
      最近更新 更多