0

我不明白为什么我必须指定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);

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

4

1 回答 1

3

它只是按照记录的方式行事。来自Double.Parse

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

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

来自Decimal.Parse

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

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值通常用于基于指数的表示很常见的科学场景,但decimal值通常不是。

于 2013-10-14T15:10:40.187 回答