【问题标题】:Parsing String to Float returns incorrect result [closed]将字符串解析为浮点数返回不正确的结果[关闭]
【发布时间】:2019-01-07 02:08:22
【问题描述】:

我尝试在 C# 中将字符串转换为浮点数。我尝试了在Converting String To Float in C# 中找到的所有变体,但我还是得到了错误的结果。

我试过了

float.Parse((string)parameter);
float.Parse((string)parameter, CultureInfo.InvariantCulture);
float.Parse((string)parameter, CultureInfo.InvariantCulture.NumberFormat);
(float)Convert.ToDouble((string)parameter);

以及所有这些没有 (string) 强制转换的变体。我没有得到编译器错误,但结果是错误的。当我使用Math.sin(convertedParameter) 然后3.14159 我得到结果2,535182E-06

编辑当我将3,14159 作为输入时,我得到-0,2622557 - 也许这会有所帮助。

【问题讨论】:

  • 如果您能提供minimal reproducible example,那就太好了。请务必包含您正在使用的输入(在 C# 代码中)和您对该输入所期望的确切结果(以及您实际收到的结果)。
  • 我还是不明白你想要什么结果。您能否向我们展示您的输入和预期输出?
  • 我尝试了Console.WriteLine(convertedParameter.ToString("G10")); 并扫描发现它变成了3.14159012,因为浮点值不准确。将您的 .NET 值与 Google 的值进行比较会产生大约 1.6E-9 (1.6 x 10^-9) 的差异,因此这似乎不是问题。
  • 另外,请注意double PI = double.Parse(Math.PI.ToString()); 然后Math.Sin(PI)Math.Sin(Math.PI) 将给出两个不同的结果。 Math.PI 的精度为 +2。如果您忽略-16,差异可能看起来非常大。
  • 您必须记住,浮点值只能准确表示由 1/2ⁿ(例如 0.5、0.25、0.125 等)或其组合(例如 0.75 等)组成的小数值,因为它必须用二进制表示。超出此范围的值表示为近似值,因此计算基于该近似值。请参阅herehere 了解更多信息。

标签: c# string floating-point


【解决方案1】:

我认为您的问题不是关于浮点结果,而是关于字符串格式。 2.535182E-06等于0.00000265358,只是另一种显示形式。您可以使用 string.Format 方法来获取您想要的格式。

string.Format("{0:F11}",Math.Sin(3.14159))

【讨论】:

  • 对不起,这不是我的意图,因为我想返回一个浮点值以进行进一步计算,但这对我也有帮助。 +1
【解决方案2】:

2.535182E-06 表示 2.535182 * 0.000001 等于 0.000002535182。 所以你得到了正确的结果,我认为你只是忽略了答案末尾的 E-06。

【讨论】:

    【解决方案3】:

    您的代码运行得非常好,但您的 pi 的准确性并不是很好,导致一个非常接近于零的数字。如果使用此值,则必须使用 10^-5 的容差。例如,使用 3.14159265359 将导致 10^-12 的容差。

    2.535182E-06 也是0.000002535182 的科学记数法。

    【讨论】:

    • 当我尝试3.14159265359 时,我在谷歌上得到-8,742278E-08,我得到-2.0682311e-13 google.com/search?q=sin(3.14159265359) 这在另一种表示法中不一样吗?
    • 好的,当我尝试 19.84 时,我得到了相同的结果,所以我认为它的不准确性 +1
    • @DoJo 还请记住,google 和 C# 可能使用不同的实现来计算三角函数。因此,这些数字可能不是 100% 相同。关键是它们的相对差异可以忽略不计,因为特别是在您正在测试的情况下,我们比较非常非常小的数字,除非您进行高度精确的数学计算(在这种情况下,您将使用具有巨大小数部分)你应该可以在任何其他应用程序上。
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2021-09-25
    相关资源
    最近更新 更多