1

简单的问题:

Console.WriteLine("Double: " + 2.0151231E7);

双:20151231

Console.WriteLine("Single: " + 2.0151231E7F);

单:2.015123E+07

为什么?


背景:我正在使用一个肥皂网络服务,其中声明了一个元素:

<xsd:element name="VALUE_FROM" type="xsd:float" />

在肥皂响应中,它看起来像这样:

<VALUE_FROM>2.0151231E7</VALUE_FROM>

但我得到的是 20151230 而不是 20151231。

4

3 回答 3

5

20151231 有 25 位二进制数。A在尾数中float只有24 个二进制数字。

所以最后一点不得不去。

于 2012-07-18T16:30:11.530 回答
3

它与 Float (IEEE 754) 与 Double 数据类型的精度有关 - 后者具有更高的精度,因此可以完全表示数字。

定义如何在计算机中表示单精度浮点数的IEEE 754标准仅指定有效数(分数)的 24 位精度(信息)和指数的 8 位信息。

于 2012-07-18T16:29:44.343 回答
1

这只是因为浮点数(在.Net 中由System.Single表示)根本不够精确。

通过使用双精度而不是浮点数,您可以获得更好的精度,但您仍然会有一些(但要少得多)近似值。

如果您想在不损失任何精度的情况下操作整数,请使用整数类型(int、uint、long、ulong 等...)

从文档中:

浮点值和精度损失

请记住,浮点数只能逼近十进制数,并且浮点数的精度决定了该数字逼近十进制数的准确度。默认情况下,Single 值仅包含 7 位精度的十进制数字,尽管内部维护最多 9 位数字。浮点数的精度有几个后果:

在特定精度下看起来相等的两个浮点数可能不相等,因为它们的最低有效数字不同。

如果使用十进制数,使用浮点数的数学或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数。

如果涉及浮点数,则值可能不会往返。如果一个操作将原始浮点数转换为另一种形式,则称一个值往返,逆运算将转换后的形式转换回浮点数,并且最终的浮点数等于原始浮点数数字。往返可能会失败,因为在转换中丢失或更改了一个或多个最低有效数字。

于 2012-07-18T16:31:15.200 回答