使用VS2012在C#上进行错误的浮点转换

时间:2014-05-04 08:29:23

标签: c# visual-studio-2012 floating-point-conversion

我在这里用C#得到了一个非常奇怪的行为:

float num = 144771463f;
// num is 144771456.0

我也试过

float num = Convert.ToSingle(144771463f);
// num is still 144771456.0

为什么会这样?

1 个答案:

答案 0 :(得分:7)

您在System.Single类型中遇到固有限制(floatSingle的名称别名。

根据MSDN(http://msdn.microsoft.com/en-us/library/system.single.aspx),Single类型有22位专用于尾数(也称为有效数字),这些是存储实际数字的位数&#39 ;在值中(其他10位存储正/负符号和指数)。

22位表示您的有效范围为0 - 4,194,304 - 而您存储的数字为144,771,463,超出(近似值)的2位小数Single的7位十进制精度。因此它只会存储144,771,46XX数字的值不会被存储,但其大小将存储在指数区域中。

您有几个选择:

  1. 使用提供51位尾数的System.Double
  2. 使用提供96位数字信息的System.Decimal,请注意Decimal处理数学运算,特别是以节省成本的方式保存更多信息(我不知道技术细节,遗憾)。