2009-09-04 97 views
2

我遇到了一個問題,我寫了一個查詢,因爲某些原因,我用來存儲十進制值的變量返回小數點後的6個值(它們大部分0)。LINQ to SQL Math.Round問題

我試過以下(和使用Math.Round的不同組合),沒有運氣。

Sales = 
      (from invhed in INVHEAD 
      ... // Joins here 
      orderby cust.State ascending 
      select new Sale 
      { 
       InvoiceLine = inv.InvoiceLine, 
       InvoiceNum = inv.InvoiceNum, 
       ... 
       NetPrice = Math.Round((inv.ExtPrice - inv.Discount) * (Decimal) (qsales.RepSplit/100.0), 2, MidpointRounding.ToEven), 
      }).ToList<Sale>(); 

的NetPrice構件具有類似值300.000000,5000.500000,3245.250000等

任何線索?我似乎無法在網上找到有關此問題的任何信息。

編輯:

Decimal.Round的伎倆(我忘了提及的是,NetPrice成員是一個小數型)。請參閱下面的答案。

回答

0

我得到它使用Decimal.Round()與以前相同的參數工作。 :)

看起來這個問題是有點在帕維爾說什麼,在小數類型的行爲有所不同,看起來Math.Round並不像他們所期望的那樣工作......

感謝您的所有輸入。

2

尾隨零可以出現在小數類型的.ToString的輸出中。您需要使用正確的格式字符串指定要顯示的小數點後的位數。例如: -

var s = dec.ToString("#.00"); 

顯示2位小數。

內部十進制類型使用整數和十進制縮放因子。它的縮放因子引起尾隨0.如果以比例因子爲2的小數類型開始,即使它們爲0,小數點後面也會有2位數字。

添加和減去小數點將產生一個小數,其中的小數位數是所涉及的小數的最大值。因此,從另一個小數點減去小數點後第一位的換算係數爲2,結果小數也相同。

小數點的乘除法將生成一個小數點,該小數點的換算係數爲兩個小數運算數的縮放因子。乘以2分的結果的比例因子小數在擁有4

比例因子試試這個新的小數: -

var x = new decimal(1.01) - (decimal)0.01; 
var y = new decimal(2.02) - (decimal)0.02; 
Console.WriteLine(x * y * x * x); 

你得到2.00000000。

+0

奇怪的是,這是劃分操作,搞亂了事情。如果我只是這樣做:inv.ExtPrice - inv.Discount,我得到一個十進制值,在我的XML輸出中只有2個小數位。 – Overhed 2009-09-04 20:29:12

2

System.Decimal通過設計保留尾隨零。換句話說,1m1.00m是兩個不同的decimals(儘管它們將相等比較),並且可以被解釋爲四捨五入到不同的小數位數 - 例如, Math.Round(1.001m)會給1m,而Math.Round(1.001m, 2)會給1.00m。算術運算符以不同的方式處理它們 - +-將產生與具有大多數(所以1.50m + 0.5m == 1.10m)和*/的操作數具有相同數量的位置的結果將具有它們的操作數的位置數的總和(所以1.00m * 1.000m == 1.00000m)。