Decimal.Parse和Double.Parse System.FormatException不同的行为

时间:2013-10-14 15:06:01

标签: c# .net number-formatting formatexception

我不明白为什么在使用NumberStyles.Float时我必须指定decimal.Parse而不是double.Parse

我能做到:

var tmp = double.Parse("1e-2");

但不是:

var tmp1 = decimal.Parse("1e-2"); 

因为抛出了System.FormatException(输入字符串格式不正确)

var tmp1 = decimal.Parse("1e-2", System.Globalization.NumberStyles.Float);

有人可以告诉我这种行为背后是否有充分的理由

1 个答案:

答案 0 :(得分:3)

它只是表现得有记录。来自Double.Parse

  

使用NumberStyles.Float和NumberStyles.AllowThousands标志的组合解释s参数。

请注意,NumberStyles.Float包含NumberStyles.AllowExponent

来自Decimal.Parse

  

使用NumberStyles.Number样式解释参数s。

NumberStyles.Number 包含NumberStyles.AllowExponent

我无法重现你的奇怪的堆栈跟踪,这些跟踪似乎表明同一个呼叫在它工作后失败了:

  • Decimal.Parse("1e-2")总是对我失败
  • Decimal.Parse("1e-2", NumberStyles.Float)一直对我有用
  • Double.Parse("1e-2")一直对我有用
  • Double.Parse("1e-2", NumberStyles.Float)一直对我有用

至于为什么“默认”数字样式在两者之间有所不同 - 我怀疑这是因为double值通常 在基于指数的表示很常见的科学场景中使用,但{ {1}}值通常不是。