首页 > 解决方案 > C# strange precision lost int to float and backwards

问题描述

curious thing happen when tried to cast from int to float and backwards.

Primitive example code:

int val = 28218681; // val=28218681

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

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

May somebody explain why conversion lost rightmost "1" from value?

Thank You Marius

标签: c#

解决方案


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

整数28218681可以用二进制写成1101011101001010100111001. 请注意,需要 25 位数字。单精度的“尾数”只有 24 位(包括隐式前导 1 位)。24 小于 25。精度丢失。单精度表示仅通过其前 24 位二进制数字“记住”一个数字。这对应于大约 7-8 个十进制数字。大致。整数28218681只有 8 位,所以问题就来了。


吸取的教训是,使用足够“宽”的类型以提供所需的精度。例如,一个double精度数可以保存一个数字的前 16 个小数位。

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


推荐阅读