2013-08-01 97 views
1

我正在努力尋找一種更好的方法來保留2位精度的十進制變量。如何保留2位精度

第一步:

在這裏,我在2個步驟劃分問題SQL查詢

中序獲得在SQL查詢中有2位精度,我使用

CONVERT(DECIMAL(10,2), .....) // to get 2 digit precision 

執行時,我能夠在SSMS中達到2位精度。

NET_TOTAL 
---------  
10.00 
12.50 
14.25 

第二步:通過C#代碼

而在我的C#代碼,當我試圖值存儲在我的C#代碼它不保留2位精度。

NET_TOTAL 
---------  
10  //lost my precision 
12.5  //lost my precision 
14.25 

以下是我的變量聲明。

public decimal? NET_TOTAL { get; set; } 

但我可以使用屬性嗅覺解決方法,但我無法得到它。

我使用

  • 進行數據庫操作。
  • FileHelper.dll的查詢列表轉換爲CSV文件。

我想知道的原因,並解決這個問題的一種方式。

任何幫助,非常感謝。

在此先感謝。

+0

您執行哪個代碼以從數據庫中獲取值? – Steve

+0

@Steve不確定這是你問的問題。對於數據庫交互,我使用Dapper.NET(用於將SQL結果轉換爲C#列表)。查詢足夠大,所以我發佈了相關的sql腳本。 – Praveen

+0

我問過這個,因爲我有一個十進制輸出參數類似的問題http://stackoverflow.com/questions/17613635/using-decimal-with-specific-precision-as-output-parameters-with-dapper – Steve

回答

0

你在表達方面令人困惑。你在SSMS中看到的是一個格式化的數字(一個字符串)。你在C#中(和在數據庫中)有一個「真實」的數字。不包括小數點後的真正正常結尾0。

如果要格式化它,你可以這樣做NET_TOTAL.ToString("0.00")

注意,有可能是另外一個問題:

NET_TOTAL = 1.245; 

decimal sum = NET_TOTAL + NET_TOTAL; 

sum將是2.29,但往返於DB NET_TOTAL後,將爲1.24或1.25(取決於數據庫如何舍入1.245),重新計算的總和將爲2.28或2.3。

+0

哦,意味着SSMS將它顯示爲一個字符串?但是我使用'CONVERT(DECIMAL(10,2),.....)'來獲取它的2位數字。 – Praveen

+0

@ user1671639如果它在你的屏幕上,它是一個字符串:-)在內存/數據庫中,數字不會保存爲「10.2」,而是** **這個數字的二進制表示(我使用** a **因爲在內存中有多種方式來表示數字)。 – xanatos

+0

明白了。從你的更新回答中,'NET_TOTAL = 1.245; 十進制總和= NET_TOTAL + NET_TOTAL;'我將不會在C#代碼中執行任何操作(沒問題:))。由於這是一個ETL,我不應該改變數據類型,是否有任何解決方法仍然保持2位精度? – Praveen

-1

這是可以接受的:

private decimal? _netTotal; 
    public decimal? NET_TOTAL{ 
     get{ 
      return _netTotal; 
     } 
     set 
     { 
      if (value.HasValue) 
      { 
       _netTotal = Math.Truncate(value.Value, 2); // or rounding 
      }else{ 
       _netTotal = value; 
      } 
     } 
    } 

如果你想保持原來的值,但有2位小數目前它,那麼你可以修改吸氣改爲:返回Math.Truncate(價值。價值,2);

+0

謝謝。讓我試一試,然後回覆你。 – Praveen

+0

不工作:(精度沒有變化, – Praveen

+0

它真的取決於你喜歡的精度 - 如果你想在某些勝利形式或網頁上獲得精度,那麼在GUI端進行格式化,如果你想要的話爲了計算精度要有2位小數,請按照我所說的做。 – Rex

2

在小數點右邊跟着零不是精度。
這只是介紹。

decimal d; 
d = 10; 
System.Diagnostics.Debug.WriteLine(string.Format("{0:N2}",d)); 
+0

嚴格來說,在.NET(而不是SQL Server)中,'decimal'類型*會分別跟蹤精度;'2M'和'2.00M'在一些情況下可以有不同的內部表示 –

+0

@MarcGravell OK同意他們可以有不同的內部表示,但2M等於2.00M,所以我認爲它們具有相同的精度,但可能是OP要求的2.00M寫作2.00沒有格式化。 – Paparazzi

1

您可以使用

decimal.Round(value,decimalPoints); 

這將返回四捨五入高達decimalPoints小數。

相關問題