解析float会导致奇怪的十进制值

时间:2014-10-08 11:30:41

标签: c# parsing floating-point

我正在尝试解析一个带有2位小数的字符串作为浮点数。

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

enter image description here

然而,双重似乎有效。

这个值看起来似乎在浮点范围内(-3.4×10 ^ 38到+3.4×10 ^ 38),所以我不明白为什么它不像我期望的那样解析它。 / p>

我尝试了一些测试,但它并没有让我更清楚地发生了什么。

enter image description here

2 个答案:

答案 0 :(得分:3)

来自System.Single的文档:

  

所有浮点数的有效位数都有限,这也决定了浮点值接近实数的准确程度。单个值的精度最多为7位十进制数,但内部最多保留9位数。

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

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

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

答案 1 :(得分:1)

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

请点击此处了解详情:Type float in C#