2014-10-08 32 views
0

我试图解析一个带有2个小数位的字符串作为浮点数。解析浮点数导致奇怪的十进制值

问题是,生成的对象有一个不正确的尾数。由于它与我所期望的相差甚远,我很难相信这是一个四舍五入的问题。

enter image description here

然而翻倍似乎工作。

这个值似乎在浮动范围内(-3.4×10^38到+3.4×10^38),所以我不明白它为什么不按照我的预期解析它。

我尝试了一些更多的测试,但它并没有让我发现更清楚的事情。

enter image description here

+0

你为什么不显示代码,而不是图像,我们可以用我们自己测试它? – 2014-10-08 11:33:12

+0

@TimSchmelter这是一个监视窗口。这是代码。这很简单。 – 2014-10-08 11:45:30

+1

如果我们有样本数据,我们可以更容易地重现您的问题。而且我们无法从图像中获取(未来将会发生任何变化)。这就是为什么我建议发布变量(包括结果)而不是图片。例如:'Console.WriteLine(float.Parse(“650512.5”))); ...'(< - 可以复制粘贴) – 2014-10-08 11:49:58

回答

3

从文档System.Single

所有浮点数具有显著位的数量有限,这也决定了一个浮点值,如何准确地近似一个实数。单值最多有7个精度的十进制数字,但内部最多保留9位数字。

这不是范围内浮动的问题 - 这是精度

最接近的确切值为650512.56(例如)是650512.5625 ...然后在观察窗口中显示为650512.5625。

说实话,如果你正在解析十进制数字,你应该用decimal来表示它。这样,假设它在范围内,并且没有超过所需的十进制数字的数量,那么您将拥有原始字符串的数字表示精确。虽然您可以使用double并且可以处理9位有效数字,但仍然不会存储您解析的确切值 - 例如,“0.1”不能完全表示为double

+0

如果你想有更高的精度,你可以使用双数据类型 – fixagon 2014-10-08 11:35:02

+0

干杯,这是有道理的,有点。现在双打会做,但精神上要注意做浮点类型系统的进一步研究。顺便爱你的C#书。 – 2014-10-08 11:50:51

1

c#中float值的尾数有23位,这意味着它可以有6-7位有效数字。在你的例子650512.59中,你有8个,这就是那个'错误'的数字。 Double有52位(15-16位)的尾数,当然它会正确显示所有8位或9位有效数字。

在这里看到更多:Type float in C#