尝试从int转换为float并向后转换时会发生奇怪的事情。
原始示例代码:
int val = 28218681; // val = 28218681
float fVal =(float)val; // fVal = 2.821868E + 07
int val2 =(int)fVal; // val2 = 28218680
有人可以解释为什么转化价值损失了最右边的“ 1”吗?
谢谢 马吕斯
答案 0 :(得分:1)
这是对现已删除的答案的评论:
整数28218681
可以用二进制形式写成1101011101001010100111001
。请注意,需要25位数字。 Single precision的“尾数”只有24位(包括隐式前1位)。 24小于25。精度下降。单精度表示形式仅通过前导的24个二进制数字“记住”数字。大约相当于7-8个十进制数字。大致。整数28218681
只有8位数字,因此出现了问题。
吸取的教训是,使用足够“宽”的类型以提供所需的精度。例如,double
精度数字可以容纳数字的前16个十进制数字。
这与关于使用二进制还是十进制格式的讨论无关。请注意,如果询问者使用decimal32
而不是binary32
(float
的另一个名称),他将遇到完全相同的问题!