2013-10-14 18 views
0

我不明白爲什麼我必須指定NumberStyles.Float使用decimal.Parse而不是double.ParseDecimal.Parse和Double.Parse System.FormatException不同的行爲

時,我可以這樣做:

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

但不是:

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

因爲System.FormatException(輸入字符串的不正確的格式)被拋出

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

有人能告訴我,如果有這種行爲背後

+0

無論您指定什麼,您的屏幕截圖似乎都顯示第15行的失敗。儘管第14行執行完全相同的操作,但您的最後一個似乎在第15行顯示出問題。真? –

+0

@JonSkeet我知道,這很瘋狂。他們是真實的。我不是在開玩笑 – giammin

+0

喬恩Skeet有一個解釋[這裏](http://stackoverflow.com/questions/3879463/parse-a-number-from-exponential-notation) – Jonesopolis

回答

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值通常不是。

+0

是的,我知道。我在問爲什麼這種不同的行爲 – giammin

+0

@giammin:如果你事先說過這會有所幫助 - 實質上你在問爲什麼默認數字格式不同,但你的問題並沒有提出這個問題。我在答案的末尾添加了一段,以表明可能的原因。 –

+0

對:我修改了我的問題以使其更清楚。 +1爲您的答案!這是合理的。也許這是從性能角度來看 – giammin