转换到十进制格式错误

本文关键字:错误 格式 十进制 转换 | 更新日期: 2023-09-27 18:33:38

Convert.ToDecimal似乎有一个奇怪的问题:-

decimal percent = 0;
double dr = 0.000015;
Convert.ToDecimal(dr.ToString());
percent = Decimal.Round(Convert.ToDecimal(dr.ToString()), 3);

这将产生错误"输入字符串格式不正确"。 稍微将 dr 值更改为 0.00015 甚至 0.100015(因此,保持相同数量的 DP)工作正常,但在前四个十进制数字为 0 的情况下则不行。 我对此有点困惑,这似乎很奇怪(但这可能很简单),我不明白为什么这会是一个文化问题?

编辑,为了澄清:这不是我的代码,我正在修复其他人代码中的错误,所以我不知道为什么以这种方式完成(可能十进制值实际上在数据行中,所以 ToString 部分可能正在处理空值)。

转换到十进制格式错误

使用 Decimal.Parse .

var convertedDecimal = Decimal.Parse(dr.ToString(), NumberStyles.Any);

dr.ToString()会返回一个带有指数符号的数字,例如:"1.5E-05" .您必须指定NumberStylesNumberStyles.Float会起作用,但您可以使用NumberStyles.Any.

或者正如@JoelCoehoorn在评论中指出的那样,您可以简单地执行以下操作:

 var convertedDecimal = Convert.ToDecimal(dr);

因为不需要转换为字符串。

你隐含的问题是:

如何将双精度转换为字符串并将其解析为小数?

答案是:你不应该。 解析是一个低效的过程,并且会打开各种潜在的错误(例如您发现的错误)。

您应该直接强制转换值:

decimal percent = 0;
double dr = 0.000015;
percent = Decimal.Round((decimal)dr, 3);