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

Mat*_*Kri 4 c# visual-studio-2012 floating-point-conversion

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

float num = 144771463f;
// num is 144771456.0
Run Code Online (Sandbox Code Playgroud)

我也试过了

float num = Convert.ToSingle(144771463f);
// num is still 144771456.0
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Dai*_*Dai 7

你在System.Single类型中遇到了固有的限制(float是别名Single).

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

22位意味着你有一个有效范围0- 4,194,304- 而你存储的数字是144,771,463,超过(近似)7位十进制精度的2位小数Single.因此它只会存储144,771,46X(X数字的值不会被存储,但其大小将存储在指数区域中).

你有几个选择:

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