小数在c#中变成不正确的分数

Posted

技术标签:

【中文标题】小数在c#中变成不正确的分数【英文标题】:Decimal numbers are turning into incorrect fractions in c# 【发布时间】:2021-11-22 22:29:47 【问题描述】:

我正在输入这个:

List<double> weightItems = new List<double> 0.23, 0.18, 0.18, 0.27, 0.14;

当我这样输出时:

objStr += "Weights: [" + String.Join(",", weightItems) + "]\n";
return objStr;

我得到这个作为输出: 权重:[0/23,0/18,0/18,0/27,0/14]

不知道为什么我会得到这个。感谢您的帮助

【问题讨论】:

编辑前贴出的代码不会编译。编辑后发布的代码返回此结果:Weights: [0.23,0.18,0.18,0.27,0.14]。 对我来说看起来不错。我在输出的字符串中看到了正确的结果。 您可能想在运行时检查NumberFormatInfo.NumberGroupSeparator 的实际值。另外,这个问题看起来很相关***.com/questions/19631640/… 我需要使用权重列表并使用它们进行计算。如何确定计算是否使用 0.23 而不是 0/23? 可能是因为当前线程的文化使用“momayyez”作为小数分隔符,可能显示为斜线。尤其是在波斯文化中(至少他们在这里是这么说的:***.com/questions/49807906/… 【参考方案1】:

首先,让我们稍微修改一下这段代码以便编译:

   List<double> weightItems = new List<double>  0.23, 0.18, 0.18, 0.27, 0.14 ;
        var objStr = "Weights: [" + String.Join(",", weightItems) + "]\n";
        Console.WriteLine(objStr); 

这应该返回以下内容:

权重:[0.23,0.18,0.18,0.27,0.14]

如果这不起作用,可能是因为您的 CultureInfo 设置错误。

要解决此问题,您应该在使用 String.Join() 之前包含此行

 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");

如果您想重现此问题 - 请使用 "fa-Ir" 代替同一行

 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fa-Ir");

这会将您的结果更改为以下内容:

权重:[0/23,0/18,0/18,0/27,0/14]

lidqy在cmets发了相关链接

lidqy's link

【讨论】:

【参考方案2】:

如果您担心这些值被破坏,您可以轻松地使用 '.' 显示这些值。通过指定例如 InvariantCulture(或任何其他使用“.”小数分隔符的文化)作为小数点。

//1. Specifying culture in explicit string format
List<double> weightItems = new List<double>  0.23, 0.18, 0.18, 0.27, 0.14 ;
var str = "Weights: [" + string.Join(",", weightItems.Select(d => d.ToString(CultureInfo.InvariantCulture))) + "]\n";
Console.WriteLine(str);

//2. Specifying thread culture and using it in implicit string format
List<double> weightItems = new List<double>  0.23, 0.18, 0.18, 0.27, 0.14 ;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
var str = "Weights: [" + string.Join(",", weightItems) + "]\n";    
Console.WriteLine(str);

两个输出:"Weights: [0.23,0.18,0.18,0.27,0.14]"

【讨论】:

以上是关于小数在c#中变成不正确的分数的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句小数变成百分数

解决从Excel导入数据库,导入到DataTable时数据类型发生变化的问题(如数字类型变成科学计数法,百分数变成小数)

小数怎么化成分数

R语言分数字符串变小数

java中如何将分数转化成小数?

SQL中将数据字段变为百分数