我正在尝试解析一个带有2位小数的字符串作为浮点数。
问题是,结果对象的尾数不正确。 由于它与我的期望相差甚远,我很难相信这是一个四舍五入的问题。
然而,双重似乎有效。
这个值看起来似乎在浮点范围内(-3.4×10 ^ 38到+3.4×10 ^ 38),所以我不明白为什么它不像我期望的那样解析它。 / p>
我尝试了一些测试,但它并没有让我更清楚地发生了什么。
答案 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#