visual studio 2012 -使用VS2012在c#上进行糟糕的浮点转换

本文关键字:转换 2012 studio 使用 VS2012 visual | 更新日期: 2023-09-27 18:01:39

我在这里得到一个非常奇怪的行为与c#:

float num = 144771463f;
// num is 144771456.0

我也试过

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

为什么会发生?

visual studio 2012 -使用VS2012在c#上进行糟糕的浮点转换

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

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

22位意味着您有0 - 4,194,304的有效范围-而您存储的数字是144,771,463,这是Single的(近似)7位十进制精度之外的2位十进制数字。因此,它将只存储144,771,46X (X的值不会被存储,但其幅度将被存储在指数区)。

你有几个选择:

  1. 使用System.Double,它提供51位尾数
  2. 使用System.Decimal,它提供了96位的数字信息,注意Decimal处理数学运算的方式以速度为代价保留了更多的信息(我不知道技术细节,抱歉)。