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

Posted

技术标签:

【中文标题】Decimal.Parse 和 Double.Parse System.FormatException 不同的行为【英文标题】:Decimal.Parse and Double.Parse System.FormatException Different behavior 【发布时间】:2013-10-14 15:06:00 【问题描述】:

我不明白为什么在使用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);

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

【问题讨论】:

您的屏幕截图似乎在第 15 行显示失败无论您指定的内容。尽管第 14 行执行完全相同的操作,但您的最后一个似乎在第 15 行出现问题。真的吗? @JonSkeet 我知道,这太疯狂了。他们是真实的。我不是在开玩笑 Jon Skeet 有解释here 【参考方案1】:

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

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

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

【讨论】:

是的,我知道。我在问为什么会有这种不同的行为 @giammin:如果您事先这么说会很有帮助-本质上您是在问为什么默认数字格式不同,但您的问题并没有问这个问题。我在答案末尾添加了一段以提出可能的原因。 正确:我修改了我的问题以使其更清楚。 +1为您的答案!这是合理的。也许是从性能的角度来看 @giammin:听起来你实际上有两个问题:1)为什么这两种类型的默认样式不同; 2)你为什么看到奇怪的行为。我不知道后者,但我怀疑它实际上并没有运行你所拥有的代码。我建议您添加额外的诊断行来证明这一点 - 并尝试在控制台应用程序中重现问题。我还建议您在每个帖子中问一个问题...

以上是关于Decimal.Parse 和 Double.Parse System.FormatException 不同的行为的主要内容,如果未能解决你的问题,请参考以下文章

C#中decimal.Parse(t70OnlinePrice.Value)保留两位小数

Decimal.Parse() 与 Convert.ToDecimal() [重复]

C# Decimal.parse的问题。有字符串 3.10 如何转换成decimal时不会变成3.1。我需要的是完整的3.10

收益计算器(用decimal类型)

C#科学计数字符串,如“7.1e-003”转换为decimal类型数据

将字符串转换为十进制,保留分数