【问题标题】:How to cut decimal off without rounding in C如何在不四舍五入的情况下在C中截断小数
【发布时间】:2012-10-06 21:24:49
【问题描述】:

如何在不四舍五入的情况下截断 C 中的小数位?

例如如果号码是4.48

它只会显示4.4

%.1f 舍入为4.5

【问题讨论】:

    标签: c rounding


    【解决方案1】:

    您可以(ab)使用整数除法截断且不舍入的事实:

    float original = 4.48;
    
    int tmp = original * 10; // 44.8 truncated to 44
    
    float truncated = tmp / 10.0; // 4.4
    

    【讨论】:

    • 为避免int 转换溢出,请使用trunc*() 回答here。仍然可能存在边缘问题。
    • 这个新的浮点除法不会引入舍入误差吗?
    【解决方案2】:

    这是一个简单的方法:

    printf("%.1f",trunc(x*10.0)/10.0);
    

    【讨论】:

    • 注意:x*10.0 可能溢出。
    【解决方案3】:

    如果你的编译器支持 C99,你应该可以使用trunc() 和朋友:

    float f = 4.56f;
    f = truncf(f * 10.0) / 10.0;
    

    【讨论】:

    • 请注意,10.0 在这里是 double,因此 */ 至少执行到 double 精度`。
    【解决方案4】:

    这应该可以工作

    double d = 4.48;
    d *= 10.;
    int i = d;
    d = (double) i / 10.; 
    

    【讨论】:

      【解决方案5】:
      float myval = 4.48;
      float tr = ((int)(myval*10)) / 10.0;
      

      【讨论】:

        【解决方案6】:

        我看到您正在使用格式说明符,这是我从脚本语言中熟悉的格式说明符。如果您使用的那个有效,那么我会假设其余的这些也有效。

        我正在考虑的语言使用相同的说明符来提供多种功能。

        如果你使用 "%0.4f" 3.14159 变成 ".1415"

        如果你使用 "%2.1f" 那么它变成 "03.1"

        如果你使用 "%1.2f 你会得到 "3.14"

        【讨论】:

        • 这并不能解决 OP 想要避免的舍入问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        相关资源
        最近更新 更多