如何使用printf以便零与小数一起打印

时间:2019-05-12 22:13:21

标签: c printf double decimal stdio

我正在C中运行一个简单的计算,对于该计算,有时结果恰好为0。然后我使用interface IMe { id: string; isActive: boolean; } function (meOrPartial: Partial<IMe> | IMe) { const meKeys = keyof IMe; // const meKeys = K in IMe; const isFull = Object.keys(meKeys).every(key => meOrPartial.hasOwnProperty(key)); } 之类的内容打印这些结果。如果结果不为0,则按照我想要的做,例如,输出可能为printf("%0.4g", result)。但是,如果结果恰好是0(通常是0),则输出将为1.796e+04

我的问题是,即使数字可能恰好为0,我该怎么做才能打印0(带小数点后4位)?

4 个答案:

答案 0 :(得分:3)

要有4个小数,必须指定.5。要使0打印为0.0,必须添加#

printf("%#.5g", 0.0);

请注意,这将打印4个小数位,与%0.4g不同的是,它将打印3个小数位。

不需要点0前的.。它用于指定在匹配字段长度时,字段的前缀应为零而不是空格。但是您没有指定字段长度,因此没有前缀发生,因此0可以省去。

答案 1 :(得分:3)

使用%g格式和#修饰符可能会满足您的要求。

printf()的POSIX规范(通常是C11 §7.21.6.1 The printf() function的超集,但此处POSIX表示与C11相同)

  
      
  • gG —表示浮点数的 double 参数应以f或{{1}的样式进行转换}(如果是e转换说明符,则为FE样式),取决于转换的值和精度。假设G等于精度(如果非零);如果省略精度则为6;如果精度为零,则等于1。然后,如果样式为P的转换的指数为E

         
        
    • 如果为X,则转换应采用样式P > X >= -4(或f)和精度F

    •   
    • 否则,转换应采用样式P-(X+1)(或e)和精度E

    •   
  •   
     

最后,除非使用'P -1'标志,否则应从结果的小数部分中删除任何结尾的零,如果没有小数部分,则应删除小数点字符。

>      

表示无穷大或NaN的 double 参数应以#f转换说明符的样式进行转换。

因此,通过在转换规范中指定F#)来保留所需的尾随零。

但是,如果要在小数点后4位,则需要使用"%#0.4g"

示例代码:

"%#0.5g"

输出(运行macOS 10.14.4 Mojave的Mac-自制的GCC 9.1.0编译器):

#include <stdio.h>

int main(void)
{
    double data[] = { 0.0, -0.0000001, +1.234E-6, 1.796e+04, 3.14159265, 6.022140857E+23, 6.62607004E-34 };
    enum { NUM_DATA = sizeof(data) / sizeof(data[0]) };
    for (int i = 0; i < NUM_DATA; i++)
        printf("%20.10g = %#0.4g\n", data[i], data[i]);
    return 0;
}

您确实认识到普朗克常数和阿伏伽德罗数的近似值,对吗?

答案 2 :(得分:2)

声明

printf("%0.4e\n", res);

可能会解决您的问题!

答案 3 :(得分:1)

您可以使用   printf("%0.4f",YourVeriable);