C 浮点数转换

来自泡泡学习笔记
跳到导航 跳到搜索

本节讨论了浮点数的转换规范:‘%f’、‘%F’、‘%e’、‘%E’、‘%g’ 和 ‘%G’ 转换。


‘%f’ 和 ‘%F’ 转换以定点表示法打印其参数,生成形式为 [-]ddd.ddd 的输出,小数点后的位数由您指定的精度控制。


‘%e’ 转换以指数表示法打印其参数,生成形式为 [-]d.dde[+|-]dd 的输出。小数点后的位数由精度控制。指数总是包含至少两位数字。‘%E’ 转换与此类似,但指数用字母 ‘E’ 而不是 ‘e’ 标记。


‘%g’ 和 ‘%G’ 转换如果指数小于 -4 或大于等于精度,则使用 ‘%e’ 或 ‘%E’(分别)的形式;否则它们使用 ‘%f’ 或 ‘%F’ 的形式。精度为0时,将其视为1。结果的小数部分中的尾随零被删除,且小数点字符后面如果有数字,则会出现小数点字符。


‘%a’ 和 ‘%A’ 转换用于以文本形式精确地表示浮点数,以便在不同的程序或机器之间进行文本交换。数字以 [-]0xh.hhhp[+|-]dd 的形式表示。小数点字符左侧恰好有一个数字。如果数字是去规范化的,则该字符只显示0。否则,值未指定;实现取决于使用的位数。小数点字符右侧的十六进制数字等于精度。如果精度为零,则确定足够大的数字来表示数字(或者,如果 FLT_RADIX 不是2的幂,则区分两个相邻值,请参阅浮点数参数)。对于 ‘%a’ 转换,小写字符用于表示十六进制数字,前缀和指数符号分别打印为0x和p。否则,使用大写字符表示十六进制字符串,并使用0X和P表示前缀和指数字符串。以2为底的指数以至少一位数字但不必要地最多位数表示为十进制数字。


如果要打印的值表示无穷大或NaN,则输出为 [-]inf 或 nan(如果转换说明符为 ‘%a’、‘%e’、‘%f’ 或 ‘%g’),或 [-]INF 或 NAN(如果转换为 ‘%A’、‘%E’、‘%F’ 或 ‘%G’)。在某些实现上,NaN可能导致更长的输出,其中包含NaN的有效负载信息;ISO C2X定义了一个宏 _PRINTF_NAN_LEN_MAX,给出此类输出的最大长度。


以下标志可用于修改行为:

  • ‘-’

    将结果左对齐到字段中。通常结果右对齐。

  • ‘+’

    始终在结果中包括正负号。

  • ‘ ’

    如果结果不以正负号开头,则在前面加上空格。由于“+”标志确保结果包含符号,因此如果您同时提供这两个标志,则忽略此标志。

  • ‘#’

    指定结果应始终包含小数点,即使没有数字跟随它。对于 ‘%g’ 和 ‘%G’ 转换,这也强制小数点后尾随零保留在它们原来的位置。

  • ’’’

    根据为LC_NUMERIC类别指定的区域设置将结果整数部分的数字分组;参见通用数字格式化参数。此标志是GNU扩展。

  • ‘0’

    用零填充字段,而不是空格;零放在任何符号之后。如果指定了“-”标志,则忽略此标志。


精度指定小数点字符后面的数字数量,对于 ‘%f’、‘%F’、‘%e’ 和 ‘%E’ 转换。对于这些转换,默认精度为6。如果精度明确为0,则完全抑制小数点字符。对于 ‘%g’ 和 ‘%G’ 转换,精度指定要打印的有效数字的数量。有效数字是小数点前的第一位数字,以及小数点后的所有数字。如果精度为0或未指定 ‘%g’ 或 ‘%G’,则将其视为1。如果无法在指定数量的数字内准确表达值,则将值四舍五入到最接近适合的数字。


没有类型修饰符,浮点数转换使用双精度类型的参数(默认情况下,所有浮点参数自动转换为双精度)。支持以下类型修饰符:

  • ‘L’ 大写的“L”指定参数是长双精度。