Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.ToDouble(“4089.90”)输出40.899,00为什么?_C#_Asp.net - Fatal编程技术网

C# Convert.ToDouble(“4089.90”)输出40.899,00为什么?

C# Convert.ToDouble(“4089.90”)输出40.899,00为什么?,c#,asp.net,C#,Asp.net,我正在开发一个使用数字精度的软件,但我有一个问题,当我把一个字符串转换成双倍时,它会以不同的文化输出我 例如,我使用 Convert.ToDouble("4089.90"); // it outputs 40.899,00 这很奇怪,因为在我的电脑中,它工作正常,但在客户端的电脑上(在区域设置中具有相同的区域性)显示后一种输出。我知道我可以用电脑来修复它 Convert.ToDouble("4089.90", System.Globalization.CultureInfo.Invariant

我正在开发一个使用数字精度的软件,但我有一个问题,当我把一个字符串转换成双倍时,它会以不同的文化输出我

例如,我使用

Convert.ToDouble("4089.90"); // it outputs 40.899,00
这很奇怪,因为在我的电脑中,它工作正常,但在客户端的电脑上(在区域设置中具有相同的区域性)显示后一种输出。我知道我可以用电脑来修复它

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

我既不知道c#也不知道asp.net,但我认为问题在于:您在一个区域性中执行操作,其中点
是千位分隔符,而不是十进制分隔符。您引用的输出就是证明:
40.899,00


您使用的区域性/区域设置是什么?

您没有说您基于何处,但输出与当前区域性一致,该区域性使用“.”作为千位分隔符和小数点逗号,而不是小数点


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

您可以使用以下设置线程的区域性:

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

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

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


与区域性设置相反,您似乎希望使用点作为十进制分隔符;因此,您必须在程序中使用
System.Globalization.CultureInfo.InvariantCulture
。抱歉。

实际上这种行为非常罕见,因为所有计算机都具有相同的区域性设置,但是我认为最好的解决方案是修改web.config,如下所示:

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

这两台电脑的操作系统都是什么?我的是Windows Vista,客户机是XP。这是所有其他答案的重复,所以我不会以我自己的方式发布。但是如果向
Convert
方法提供
InvariantCulture
可以解决问题,那么这显然是一个涉及文化的问题。您应该将日志添加到输出区域性信息的程序中,并向报告问题的用户请求该日志。然后你可以回到他们那里说,“这是因为你的计算机上有这些设置:诸如此类”。@jdmichal如果两个程序需要不同的设置才能正常运行?最好只是正确地编写程序,不要强迫用户更改计算机以适应程序。我没有说,“所以你需要将其更改为此!”我只是说,这将揭示问题,以便你可以告诉他们问题是什么。其余的你自己读。实际情况是,你会给他们成本估算来修复你的程序。然后他们会自己改变它,而不需要你问!(是的,我是在开玩笑。)我的文化背景来自洪都拉斯,千的分隔符是逗号,小数点是点。正如我所引用的,很少有客户端机器使用相同的区域设置。但是如果区域设置是洪都拉斯,那么输出怎么可能是40.899,00?这是我的问题,我一直在网上寻找,msdn说“由于精度不同,返回值可能不完全等于值,对于小于两倍的值::.Epsilon,返回值也可能因处理器体系结构而异。”“我能说什么呢?我很困惑,这与你的问题无关。”。请看我的答案。MSDN中的评论与此无关。这一评论基本上是说十进制到二进制的转换并不总是精确的,而且可以非常非常小的数量关闭。请参见“我的区域性设置”,显示逗号表示千位分隔符,显示点表示小数。我的电脑工作正常,而不是客户端使用与我不同的操作系统(我使用Vista,客户端使用XP)显示另一个输出。@nmiranda-在这种情况下,客户端必须按照我描述的方式更改其设置。轶事:我以前遇到过类似的问题。我喜欢(旧的)德国时间格式,24小时由一个点分隔。解析我的HTTPS安全证书的程序没有:),因此仅检查区域性名称是不够的;魔鬼在细节中。+1用于解决问题,“我想了解为什么会发生这种情况”。服务器具有相同的区域性设置。+1用于解决问题,“但是程序中有很多代码使用“Convert.ToDouble”,我不想全部更改。”正如我所说的“程序中有很多代码使用”Convert.ToDouble“我不想全部改变”。这是迈克尔。