c语言中printf函数怎么才能自动去掉小数点后的零?,关于printf用%f输出整数时为0的问题分析…

  • Post author:
  • Post category:其他


## 1 问题描述

可能有时候会闲着无聊,就想要试试printf试着不同参数在不同格式下的输出结果。就在某一次无意操作中,当用%f格式输出整数1时,发现终端显示结果为0.000000,这是为什么呢?

——

## 2 解惑“1以%f格式输出时显示为0.000000”

问题已经出现了,为什么会有这么奇葩的结果呢?原因就是,浮点数与整型数的存储方式是不一样的。

### 2.1 IEEE754标准浮点数存储方式

在二进制科学表示法中,value=(-1)^S * (1.M) * 2^(E-Offset),主要由三部分构成:符号位(S) + 阶码(E) + 尾数(M)。

– 符号位(Sign):0代表正,1代表负

– 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移码形式存储。

– 尾数(Mantissa):尾数部分

| 类型 | 符号位位数 | 阶码位数 | 尾数位数 | 总位数 | 偏置值 |

|——–|—————–|———————|——————–|——–|——–|

| float | 占1位,在第31位 | 占8位,在第30~23位 | 占23位,在第22~0位 | 32 | 0x7F |

| double | 占1位,在第63位 | 占11位,在第62~52位 | 占52位,在第51~0位 | 64 | 0x3FF |

– 阶码

阶码即指数位,采用移码形式存储。简单的理解,阶码就是将数值以二进制科学表示法表示时,此时它的阶数即为阶码值。

不过,阶码值是由偏置值(Offset)加上阶码真值确定的,因为指数是有正负数的。

– 对于float类型数据,其偏置值为127,表示阶数范围为-128~127;

– 对于double类型数据,其偏置值为1023,表示阶数范围为-1024~1023.

– 尾数

有数是有效数值位,存储了数值转换为二进制科学计数法的尾数值,用原码表示。

– 移码

移码是符号位取反的补码,引入的目的是为了保证浮点数的机器零为全零。

当用补码表示阶码的时候,当阶码无限小,产生了下溢的时候,阶码变成了0,那么这个