.NET有些值乘以某些机器上的大因子而不是其他机器

时间:2011-03-12 00:04:01

标签: c# .net internationalization floating-point

我有一个相当奇怪的问题。我有一个非常简单的应用程序,它从csv格式的文件中读取一些数据,并将一个极性“蝴蝶”绘制到一个表单。然而,欧洲国家的一些人会得到一个非常奇怪的曲线,当我修改程序输出一些样本值来尝试和锻炼正在发生的事情时,它只给了我更多的问题!

以下是预期值的示例,以及特定用户获得的内容:

EXPECTED -> SEEN   
0.00 0.00  -> 0,00 0,00  
5.00 1.35  -> 5,00 1346431626488,41  
10.00 2.69 -> 10,00 2690532522738,65  

所以右边的所有值(在我的程序中计算)都乘以10 ^ 12!如何在CLR中发生这种情况?第一个数字 - 0,5,10 - 只是由写入输出的简单循环产生,使用:value += 5.

产生这些计算的代码确实使用alglib.net库进行插值,但是从http get返回的xml中提取的其他2个值也会出现问题,然后从弧度转换为度数。 / p>

也不是一个问题,但为什么十进制值会用逗号而不是小数点打印?输出代码是一个简单的string.Format("{0:F}", value),其中值是double?

那么,为什么一些值会被移动12位小数,而不是其他值,并且仅在某些国家?是的其他人运行应用程序没有问题...不确定是否有任何相关性,但这个输出来自荷兰。

4 个答案:

答案 0 :(得分:5)

不同的文化使用不同的千位和小数分隔符。 en-US(美国英语)使用“,”和“。”但de-DE(德国德语)使用“。”和“,”。这意味着在阅读或写入字符串时,您需要使用适当的文化。保留信息以供日后检索时,通常意味着CultureInfo.InvariantCulture。向用户显示通常意味着CultureInfo.CurrentCulture的信息时。

您尚未提供从CSV文件中读取的代码,但我想您正在为每个字段执行double.Parse(field)之类的操作。如果该字段的值为“5.0”,则在当前文化为de-DE时解析它“。”将被视为千位分隔符,并且以美国术语将该值读取为50.0。你应该做的是double.Parse(field, CultureInfo.InvariantCulture)

所有ParseTryParseFormat和许多ToString方法都接受IFormatProvider。养成始终提供适当格式提供者的习惯,不会被国际化问题所困扰。

答案 1 :(得分:3)

我的个人猜测是你有一个字符串 - >数字转换在一个完全没有文化意识的地方。

为什么简单运行此代码:

var nl = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
var numberString = "1.000000000000000";
Console.WriteLine(float.Parse(numberString, nl));

结果为1E+15现在您只需找到需要提供CultureInfo.InvariantCulture(简体中文,相当于C中"C"文化)的地方{{1}与字符串一起。

答案 2 :(得分:0)

在某些语言中,使用decimal comma而不是小数点。这取决于文化。如果对你来说重要的是只使用点,你可以强迫自己的文化。

答案 3 :(得分:0)

有一点值得注意的是,如果1346431626488除以1,000,000,000,000,那么你将得到1.35四舍五入到小数点后两位。如果2.69除以1,000,000,000,000那么你会得到2.69四舍五入到小数点后两位。只是观察。