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

本文关键字:Parse FormatException Double System Decimal | 更新日期: 2023-09-27 18:35:29

我不明白为什么在使用decimal.Parse时必须指定NumberStyles.Float而不是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);

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

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

它的行为就像记录的那样。从Double.Parse

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

请注意,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值通常不是。