代码之家  ›  专栏  ›  技术社区  ›  Strahinja

从数学上把浮点数四舍五入到小数点后N位

  •  -5
  • Strahinja  · 技术社区  · 7 年前

    我想把浮点数/双数四舍五入到小数点后n位。但不是在印刷业,而是在一般情况下。
    e、 g:用户的输入是:2.38913,所以输出应该是2.389
    或者如果用户输入5.98441 4,则输出应为:5.9844

    #include <stdio.h>
    #include <math.h>
    
    int main () {
    
    float num;
    int decimals;
    
    scanf("%f%d", &num, &decimals); //5.2381 2
    
    int res = num; // res = 5
    
    int power = 1;
    int i = 0;
    for(i = 0; i < decimals; i++)
        power*=10; // 1 * 10 * 10
    
    int num3 = num * power; // num3 = 523
    int num2 = num3 % power;//
    
    float a = num2*1.0 / power*1.0;
    // float a = 23*1.0/13.0;
    printf("%f %d\n", a, power);
    
    a = res + a;
    
    printf("%f", a);
    
    return 0;
    }
    

    作为这里的输出,我得到:239000。我不想有这些零,也不想使用固定%.2f。我遗漏了什么?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Tom Kuschel    7 年前

    一般来说,这项任务是不可能的,因为ieee754转换是二进制浮点数的表示,可以是float,也可以是double。所以上面一行 scanf("%f%d", &num, &decimals); //5.2381 2 是否将十进制(以10为基数)数转换为二进制浮点数,并且此转换通常不是exext,因为只有有限的位数。 您可以减少位的数量(二进制),但这不是在十进制系统中定义的。 打印浮点(双精度)数字时,由于将二进制浮点计算转换为十进制浮点计算,会出现第二个不精确的情况。

        2
  •  1
  •   Tim Palak Chaudhary    7 年前

    这里有两件事要做:1)计算一个数字的舍入值,2)打印这个数字。

    计算舍入值

    你做得很对。请注意,当隐式转换 float 到一个 int ,C进行截断,而不是舍入,因此:

    float f = 1.9;
    int i = f;
    

    i 1 ,不是 2 . 在您的例子中,如果您的输入是“1.2292”,那么您计算的值是1.22,而不是1.23。这可能是你想要的,但可能不是。如果你想来 远离的 而不是 接近零度 您可能需要更改以下内容:

    int num3 = num * power;
    

    收件人:

    int num3 = 0.5 + num * power;
    

    打印舍入值

    计算完值后,就可以打印了。如果只想打印舍入到的小数位数,可以使用 printf() 这样地:

    printf("%.*f\n", decimals, a);
    
        3
  •  0
  •   Peter    7 年前

    一般来说,这是不可能的。C和C++中的浮点最终根据基数、尾数、符号和指数来指定。

    十进制浮点数是以10为基数的。在现代硬件上,这是非常罕见的。一些早期的计算硬件(比如1946年创建的ENIAC)支持十进制浮点。然而,这种表示在现代硬件中是相当罕见的。

    现代硬件上最常见的浮点表示法使用 2 (即二进制)。二进制浮点不能表示所有的小数。尝试表示十进制值 0.1 使用负幂和 2 (就像 1/2 , 1/4 , 1/8 等)。你会发现 0.1 包含一个十进制的无穷级数。原因类似于分数 1/3 不能用有限的小数位数表示(即。 0.33333.... 数字在哪里 3 永远重复)。

    非理性价值观(如 sqrt(2.0) , pi ,和其他)也不能用有限位数的任何基数精确表示。因此,不可能设计一种固定大小和有限大小的浮点类型来精确地保存这些值。

    推荐文章