使用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部分可能正在处理空值。)
答案 0 :(得分:4)
var convertedDecimal = Decimal.Parse(dr.ToString(), NumberStyles.Any);
dr.ToString()
会返回一个带有指数符号的数字,如:"1.5E-05"
。您必须指定NumberStyles
。 NumberStyles.Float
可以使用,但您可以使用NumberStyles.Any
。
或者正如@JoelCoehoorn在评论中指出的那样,你可以这样做:
var convertedDecimal = Convert.ToDecimal(dr);
因为不需要转换为字符串。
答案 1 :(得分:-1)
你暗示的问题是:
如何将double转换为字符串并将其解析为小数?
答案是:你不应该。解析是一个低效的过程,会打开各种潜在的错误(就像你发现的那样)。
您应该直接投射该值:
decimal percent = 0;
double dr = 0.000015;
percent = Decimal.Round((decimal)dr, 3);