当输入为2.0151231E7F时,为什么不能获得20151231

时间:2012-07-18 16:25:09

标签: c# floating-point

简单问题:

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。

3 个答案:

答案 0 :(得分:5)

20151231有25位二进制数字。 float只有24 binary digits in the mantissa

所以最后一点不得不去。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

这只是因为浮动(用System.Single表示的.Net)根本不够精确。

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

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

来自文档:

  

浮点值和精度损失

     

请记住,浮点数只能近似小数   number,并确定浮点数的精度   这个数字接近十进制数的准确程度如何。默认情况下,   单个值仅包含7个十进制数字的精度,尽管a   内部最多保留9位数字。一个人的精确度   浮点数有几个结果:

     

两个浮点数对于特定的看似相等   精度可能无法比较,因为它们最不重要   数字是不同的。

     

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

     

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