C#奇怪的精度丢失了int浮点数

时间:2018-11-23 13:09:29

标签: c#

尝试从int转换为float并向后转换时会发生奇怪的事情。

原始示例代码:

  

int val = 28218681; // val = 28218681

     

float fVal =(float)val; // fVal = 2.821868E + 07

     

int val2 =(int)fVal; // val2 = 28218680

有人可以解释为什么转化价值损失了最右边的“ 1”吗?

谢谢 马吕斯

1 个答案:

答案 0 :(得分:1)

这是对现已删除的答案的评论:

整数28218681可以用二进制形式写成1101011101001010100111001。请注意,需要25位数字。 Single precision的“尾数”只有24位(包括隐式前1位)。 24小于25。精度下降。单精度表示形式仅通过前导的24个二进制数字“记住”数字。大约相当于7-8个十进制数字。大致。整数28218681只有8位数字,因此出现了问题。


吸取的教训是,使用足够“宽”的类型以提供所需的精度。例如,double精度数字可以容纳数字的前16个十进制数字。

这与关于使用二进制还是十进制格式的讨论无关。请注意,如果询问者使用decimal32而不是binary32float的另一个名称),他将遇到完全相同的问题!