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

Aar*_*age 0 .net c# floating-point internationalization

我有一个相当奇怪的问题.我有一个非常简单的应用程序,它从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  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mik*_*ike 5

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

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

所有的Parse,TryParse,Format,和许多ToString方法接受的IFormatProvider.养成一直提供适当的格式提供者的习惯,你不会被国际化问题所困扰.