4

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

float num = 144771463f;
// num is 144771456.0

我也试过

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

为什么会这样?

4

1 回答 1

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,这是 2 位十进制数字,超出了 . 的(大约)7 位十进制精度Single。所以它只会存储144,771,46XX不会存储数字的值,但它的大小会存储在指数区域中)。

你有几个选择:

  1. 使用System.Double提供 51 位尾数
  2. 使用System.Decimal它提供 96 位数字信息,请注意,它Decimal专门处理数学运算,以牺牲速度为代价保留更多信息(我不知道技术细节,抱歉)。
于 2014-05-04T08:35:24.293 回答