为什么我没有得到20151231当输入为2.0151231E7F
简单问题:为什么我没有得到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.
这只是因为一个浮点数(用.Net表示的System.Single)不够精确。
你可以通过使用double而不是float来获得更好的精度,但是你仍然会有一些(但少得多)的近似值。
如果你想操纵整数没有任何精度损失,使用整数类型(INT,UINT,长,ULONG等)
从文档:
浮点点值和精密
的损失请记住,浮点数只能近似于十进制数 ,而浮点精度数决定 如何ACCU率那个数字接近一个十进制数字。默认情况下, 单个值仅包含7位精度的十进制数字,尽管 最多可以在内部维护9位数字。一个 浮点数的精度有几种结果:出现等于特定 精度,因为他们至少显著 位数是不同的可能比不上等于
两个浮点数。
使用浮点如果一个十进制数被用于 因为浮点数可能无法精确近似 十进制数 数目可能不产生相同的结果的数学或比较操作。
如果涉及浮点数,则值可能不会往返。如果一个操作将某个操作将原始的浮点数转换为另一种形式,则操作数 值被称为往返,反操作将转换后的格式转换回浮点数,最后的浮点数等于原始的浮点数。 往返可能会失败,因为转换中丢失或更改了一个或多个最低有效数字 。
谢谢,但在这种情况下,数据类型是由我必须使用的Web服务决定的。 – mono68 2012-07-18 17:02:04
您引用的URL不支持浮点数只有尾数24位的声明。它根本不使用术语“尾数”,因为这是错误的术语。尾数是对数的小数部分。浮点表示的小数部分是有效数。 – 2012-07-18 16:39:11
这两个术语都被使用,@EricPostpischil。只是没有在特定的文章。 – harold 2012-07-18 16:43:27
“尾数”一词并未出现在1985或2008 IEEE 754标准中。它在参考浮点时的使用是草率和误导性的。 – 2012-07-18 16:48:10