【问题标题】:Convert.ToDouble("4089.90") outputs 40.899,00 why?Convert.ToDouble("4089.90") 输出 40.899,00 为什么?
【发布时间】:2019-09-04 20:18:33
【问题描述】:

我正在开发一个使用数字精度的软件,但我遇到了这个问题,当我将一个字符串转换为 double 时,它​​会输出不同的文化。

例如我用

Convert.ToDouble("4089.90"); // it outputs 40.899,00

很奇怪,因为在我的计算机上它工作正常,但在客户端的 PC 上(在区域设置中具有相同的文化)显示后一个输出。我知道我可以使用

修复它
Convert.ToDouble("4089.90", System.Globalization.CultureInfo.InvariantCulture);

但是程序中有很多使用“Convert.ToDouble”的代码,我不想全部更改,另一方面我想了解为什么会发生这种情况。

【问题讨论】:

  • 两台电脑使用什么操作系统等?
  • 我的是 Windows Vista,客户端机器是 XP。
  • 这是所有其他答案的副本,所以我不会作为我自己的答案发布。但是,如果将InvariantCulture 提供给Convert 方法可以解决问题,那么这显然是一个涉及文化的问题。您应该将日志记录添加到输出文化信息的程序中,并要求报告问题的用户提供该日志。然后你可以回过头来对他们说,“这是因为你的电脑上有这些设置:blah blah”。
  • @jdmichal 如果两个程序需要不同的设置才能正常运行?最好只是正确地编写程序,而不是强迫用户更改他们的计算机以适应程序。
  • 我没有说,“所以你需要把它改成这个!”我只是说,它会揭示问题,以便您可以告诉他们它是什么。您自己阅读其余部分。它实际上会如何进行,然后您将向他们提供修复您的程序的成本估算。然后他们会自行更改,而无需您询问! (是的,我在开玩笑。)

标签: c# asp.net


【解决方案1】:

您可以通过以下方式为线程设置文化:

Thread.CurrentThread.CurrentCulture = 
       System.Globalization.CultureInfo.InvariantCulture;

【讨论】:

  • +1,因为这解决了问题,“但是程序中有很多代码使用“Convert.ToDouble”,我不想全部更改。”
  • 正如我所说的“程序中有很多代码使用“Convert.ToDouble”,我不想全部更改”。谢谢jdmichael。
【解决方案2】:

你没有说你在哪里,但输出与当前文化一致,即有“。”作为千位分隔符和小数点逗号而不是小数点。

但是,您说文化是相同的 - 这与此相矛盾。您或客户是否更改(或自定义)区域和语言选项中的“标准和格式”?如果该设置已被自定义,它仍将显示为“英语(英国)”(或任何地方),但会产生与默认设置不同的结果。

【讨论】:

  • 我的文化设置显示逗号表示千位分隔符,点表示小数点。我的 PC 工作正常,而不是客户端使用与我不同的操作系统(我的为 Vista,客户端的 XP)显示另一个输出。
  • @nmiranda - 在这种情况下,客户必须按照我描述的方式更改了他们的设置。
  • 轶事:我以前也遇到过类似的问题。我喜欢用点分隔的 24 小时(旧)德国时间格式。解析我的 HTTPS 安全证书的程序没有 :) 所以仅仅检查文化名称是不够的;魔鬼在细节中。
  • +1 用于解决问题,“我想了解为什么会发生这种情况”。
【解决方案3】:

我既不知道 c# 也不知道 asp.net,但我认为问题在于:您在点 . 是千位分隔符而不是小数分隔符的文化中执行操作。您引用的输出就是证明:40.899,00

您在什么文化/地区工作?

【讨论】:

  • 我的文化设置来自洪都拉斯,其中千位分隔符是逗号,小数点是点。我引用的罕见情况是客户端机器使用相同的文化设置。
  • 但是如果文化设置是洪都拉斯,怎么能输出40.899,00呢?
  • 这是我的问题,我一直在网上寻找,msdn 说“由于精度差异,返回值可能不完全等于 value,并且对于 value 的值小于 Double..::.Epsilon,返回值也可能因处理器架构而异”。我能说什么我很困惑。
  • 这与你的问题无关。看我的回答。
  • MSDN 中的那条评论与此无关。该评论基本上是说十进制到二进制的转换并不总是准确的,并且可能会偏离非常非常小的数量。见en.wikipedia.org/wiki/Floating%5Fpoint#Accuracy%5Fproblems
【解决方案4】:

文化可能基于 ASP.Net 应用程序的运行位置,而不是运行浏览器的客户端 PC。虽然他们的台式电脑可能具有相似的文化设置,但服务器可能会有所不同。

【讨论】:

  • 服务器具有相同的文化设置。
【解决方案5】:

没有给出正确答案的是您的计算机,而不是他们的计算机。您的文化规定“4089.90”与 4089900 相同,因为点 (.) 用于分隔千位(因此点后面应该有三个数字)。

您似乎想使用点作为小数分隔符,这与您的文化设置相反;所以你必须在你的程序中使用System.Globalization.CultureInfo.InvariantCulture。对不起。

【讨论】:

    【解决方案6】:

    实际上这种行为非常罕见,因为所有机器都具有相同的文化设置,但是我认为最好的解决方案是像这样修改 web.config:

    configuration>
      <system.web>
        <globalization culture = "es-HN" />
      </system.web>
    </configuration
    

    并将设置应用于整个应用程序。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多