问题描述
假设现在有这样一个需求,将double
类型的数据转成float
,由于C++并不会执行隐式类型转换,因此一般的做法是用float
强制转换。
示例如下:
float b = (float) a; //a是double类型
看上去这个转换人畜无害,但请见下面示例:
可以看到,a
原来是463440.620,而转成float
类型,变成了463440.625,损失了相当的精度。
结论
究其原因,其实是float
用32位存储,只能保证6 ~7位的有效数字,而double
是64位,能保证15 ~ 16位的有效数字。C++的隐式类型转换能从float
转double
(不会出现精度损失),但从double
转float
的强制类型转换可能会出现精度损失,使用时需要格外注意。