.net Decimal.Parse和Double.Parse行为

时间:2015-08-25 12:16:28

标签: .net vb.net parsing .net-3.5

我最近偶然发现Decimal.Parse的一些不直观的行为,我想讨论。案件如下。 我的程序从其他程序获取数字作为字符串,"科学地"格式化(它对我来说是一个黑盒子)。使用Decimal.Parse解析字符串。

Dim Value As Decimal = Decimal.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo)

一切都很好,直到它试图解析"1.9721522630525295e-31"。在此字符串上,Decimal.Parse引发了OverflowException。 "确定,"我想,"让我们试试Double!"

Dim dblValue As Double = Double.Parse(StrValue)

这很好用。种类:结果是0.0000000000000019721522630525295。 (或:Double.Parse(StrValue).ToString = "1,97215226305253E-15"

好的,接下来试试。

Dim dblValue As Double = Double.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo)

按预期工作,E-31保持这种状态。

所以,这是我的第一个问题:为什么Double.Parse表现得这样?

编辑按照这种方式"我的意思是给我比预期的数量多16个数量级(E-15而不是E-31)。 varocarbas提出的问题是 answer :原因是我的本地小数和千位分隔符设置。 .中的"1.9721522630525295e-31"Double.Parse(StrValue)视为千位分隔符(即被忽略),因此值为0.0000000000000019721522630525295

然后我就像以前一样,将结果转换为十进制。

Dim decValue = CDec(dblValue)

没有例外,但我得到的价值再次是1.9721522630525295E-15。 在谷歌之后,我了解了Convert.ToDecimal,其工作正常(...E-31转换为0。)

第二个问题:我们应始终使用Convert.ToDecimal而不是CDec,还是有一些规则或最佳做法或其他?

所以,毕竟我现在使用以下代码。

If Not Decimal.TryParse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, _
                           Value) Then
    Value = Convert.ToDecimal(Double.Parse(StrValue, Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo))
End If

我的第3次和最后一次(目前)问题是:这段代码是正确的方法吗?

(规格:Vis​​ual Studio 2005,.net 3.5,应用程序编译为32位,Windows语言环境设置为德语。)

0 个答案:

没有答案