mysql丢失召回_取浮点数的整数部分(确实有点无聊,不喜欢就召回删除)

float a = 6.7f;

float b = a * 10;

int c = a * 10;

int d = b;

printf( "%d", c ); // 输出 66

printf( "%d", d ); // 输出 67

在解释结果前,得先了解几个知识点:

1. 即使在表达范围内,浮点数(float、double、long double)也不能精确表达每一个实数。

比如float可以精确表达67.0f,可以精确表达6.69999980926513671875f,但不能精确表达6.7f。

当不能精确表达时,选择一个最接近的能精确表达的数,比如float以6.69999980926513671875f来表达6.7f。

2. 浮点数计算使用80387数字协处理器,把每一个浮点数载入80bits的临时实数中,进行计算,结果然后再放回。

3. 高精度浮点数转化为低精度浮点数时,使用低精度浮点数能表示的最接近的数;浮点数转化为整型时,直接取整数部分。

于是流程如下:

float a = 6.7f;   // a 为 6.69999980926513671875f

float b = a * 10; // 计算结果66.9999980926513671875l 放入 float 中时,变为67.0f,因为67.0f是float能表示的,且最接近66.99……的数。

int c = a * 10;   // 计算结果66.9999980926513671875l 取 整数部分 66

int d = b;        // 67.0f 取 整数部分 67

可见,差别在于C是由long double直接取整数部分,而d是long double放到float后再取的整数部分,奥妙就在“由long double放到float”这一阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值