2012-07-18 67 views
1

简单问题:为什么我没有得到20151231当输入为2.0151231E7F

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

双:20151231

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

单:2.015123E + 07

为什么?


背景:我耗费了SOAP网络服务,其中一个元素声明:

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

在SOAP响应它看起来像这样:

<VALUE_FROM>2.0151231E7</VALUE_FROM> 

但我'20151230而不是20151231.

回答

5

20151231具有二进制25位数字。 A float只有24 binary digits in the mantissa。因此最后一点不得不离开。

+0

您引用的URL不支持浮点数只有尾数24位的声明。它根本不使用术语“尾数”,因为这是错误的术语。尾数是对数的小数部分。浮点表示的小数部分是有效数。 – 2012-07-18 16:39:11

+0

这两个术语都被使用,@EricPostpischil。只是没有在特定的文章。 – harold 2012-07-18 16:43:27

+0

“尾数”一词并未出现在1985或2008 IEEE 754标准中。它在参考浮点时的使用是草率和误导性的。 – 2012-07-18 16:48:10

3

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

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

+0

+1正确使用“有效数”而不是“尾数”(正确的是对数的小数部分,而不是浮点数表示的小数部分)。 – 2012-07-18 16:37:09

+0

非常感谢,并且还为+1提供了宝贵的答案。 – mono68 2012-07-18 16:59:25

+0

不客气@mon68 – 2012-07-18 17:20:49

1

这只是因为一个浮点数(用.Net表示的System.Single)不够精确。

你可以通过使用double而不是float来获得更好的精度,但是你仍然会有一些(但少得多)的近似值。

如果你想操纵整数没有任何精度损失,使用整数类型(INT,UINT,长,ULONG等)

从文档:

浮点点值和精密

的损失请记住,浮点数只能近似于十进制数 ,而浮点精度数决定 如何ACCU率那个数字接近一个十进制数字。默认情况下, 单个值仅包含7位精度的十进制数字,尽管 最多可以在内部维护9位数字。一个 浮点数的精度有几种结果:出现等于特定 精度,因为他们至少显著 位数是不同的可能比不上等于

两个浮点数。

使用浮点如果一个十进制数被用于 因为浮点数可能无法精确近似 十进制数 数目可能不产生相同的结果的数学或比较操作。

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

+0

谢谢,但在这种情况下,数据类型是由我必须使用的Web服务决定的。 – mono68 2012-07-18 17:02:04

相关问题