C# 分析导致奇怪十进制值的浮点
我试图将一个小数点后两位的字符串解析为浮点 问题是,结果对象的尾数不正确。 由于这与我的预期相差甚远,我很难相信这是一个四舍五入的问题 然而,双倍似乎有效 这个值似乎在浮点值(-3.4×10^38到+3.4×10^38)的范围内,所以我不明白为什么它不能像我期望的那样解析它 我又做了几次测试,但并没有让我更清楚发生了什么C# 分析导致奇怪十进制值的浮点,c#,parsing,floating-point,C#,Parsing,Floating Point,我试图将一个小数点后两位的字符串解析为浮点 问题是,结果对象的尾数不正确。 由于这与我的预期相差甚远,我很难相信这是一个四舍五入的问题 然而,双倍似乎有效 这个值似乎在浮点值(-3.4×10^38到+3.4×10^38)的范围内,所以我不明白为什么它不能像我期望的那样解析它 我又做了几次测试,但并没有让我更清楚发生了什么 来自以下文档: 所有浮点数的有效位数有限,这也决定了浮点数逼近实数的精度。单个值的精度最多为7位小数,但内部最多保留9位小数 这不是浮动范围的问题,而是精度的问题 最接近65
来自以下文档: 所有浮点数的有效位数有限,这也决定了浮点数逼近实数的精度。单个值的精度最多为7位小数,但内部最多保留9位小数 这不是浮动范围的问题,而是精度的问题 最接近650512.56(例如)的精确值是650512.5625。。。然后在“监视”窗口中显示为650512.5625
老实说,如果要解析十进制数,可能应该使用
decimal
来表示它。这样,假设它在范围内,并且小数位数不超过所需的位数,您将获得原始字符串的精确数字表示形式。虽然您可以使用double
并对9个有效数字保持良好状态,但您仍然无法存储解析的准确值-例如,文档中的“0.1”不能准确表示为double
:
所有浮点数的有效位数有限,这也决定了浮点数逼近实数的精度。单个值的精度最多为7位小数,但内部最多保留9位小数
这不是浮动范围的问题,而是精度的问题
最接近650512.56(例如)的精确值是650512.5625。。。然后在“监视”窗口中显示为650512.5625
老实说,如果要解析十进制数,可能应该使用
decimal
来表示它。这样,假设它在范围内,并且小数位数不超过所需的位数,您将获得原始字符串的精确数字表示形式。虽然您可以使用double
并可以处理9个有效数字,但仍然无法存储解析的准确值-例如,“0.1”不能准确表示为double
c中浮点的尾数有23位,这意味着它可以有6-7个有效数字。在您的示例650512.59
中,您有8个数字,而正是那个数字“错了”。Double的尾数为52位(15-16位),因此它当然会正确显示所有8或9位有效数字
更多信息请参见此处:c#中浮点的尾数有23位,这意味着它可以有6-7个有效数字。在您的示例
650512.59
中,您有8个数字,而正是那个数字“错了”。Double的尾数为52位(15-16位),因此它当然会正确显示所有8或9位有效数字
查看此处了解更多信息:为什么不显示代码而不是图像,我们可以自己测试它?@TimSchmelter这是一个观察窗口。这就是代码。这很简单。如果我们有样本数据,我们将更容易复制您的问题。而且我们无法从图像中获得它(将来无论如何都会腐烂)。这就是为什么我建议发布变量(包括结果),而不仅仅是图像。例如:
Console.WriteLine(float.Parse(“650512.5”))代码>(我认为代码是不言自明的,任何更多的东西,如Console.WriteLine都是多余的。话虽如此,我承认你关于图像旋转的观点。我并没有说这个问题不清楚。我想如果人们能够重现你的问题,他们会更愿意提供帮助。手动输入所有数字,而不是复制粘贴,只需要更多的工作g你的样本。你为什么不显示代码而不是图像,我们可以自己测试它?@TimSchmelter这是一个观察窗口。这就是代码。这很简单。如果我们有样本数据,我们将更容易重现你的问题。我们无法从图像中获取它(将来会腐烂)。这就是为什么我建议发布变量(包括结果),而不仅仅是图像。例如:Console.WriteLine(float.Parse(“650512.5”);…
(我认为代码是不言自明的,任何更多的东西,如Console.WriteLine都是多余的。话虽如此,我承认你关于图像旋转的观点。我并没有说这个问题不清楚。我想如果人们能够重现你的问题,他们会更愿意提供帮助。手动输入所有数字,而不是复制粘贴,只需要更多的工作g你的样本。如果你想有更高的精度,你可以使用双数据类型Cheers,这是有意义的,有点。现在可以使用双数据类型,但请注意对浮点类型系统进行进一步研究。顺便说一句,我爱你的C#书。如果你想有更高的精度,你可以使用双数据类型Cheers,这是有意义的,有点.Double现在就可以了,但请注意对浮点型系统做进一步的研究。顺便说一下,我喜欢你的C#书。