2012-01-17 39 views
1

我原本問這個here,但不得不單獨詢問。爲什麼我將零點添加到我從MS Access數據庫中提取的十進制值?

爲什麼我從數據庫中獲得像2.01000000這樣的值,即使我只存儲小數點2.01?在我的數據庫中,我將其視爲2.01而不是2.010000。 MS Access中的字段是十進制類型,我將其存儲爲2.01本身。我拉這樣的價值:

while(reader.Read()) 
     Convert.ToDecimal(reader[i]); 

我得到的值爲2.010000000。爲什麼?有沒有更好的方法從數據庫中讀取十進制值?我已將字段的精度設置爲28,比例因子設爲18.

+0

嗯。我原以爲它會是2.010000000000000000的方式更多的零比2.01000000。生活和學習...... – 2012-01-17 16:49:18

+0

您在'reader [i]'中獲得的原始價值是多少?它是一個字符串嗎?如果是這樣,它有額外的數據? – JaredPar 2012-01-17 16:52:00

+0

@JaredPar閱讀器[i]是一個對象 – nawfal 2012-01-17 16:56:15

回答

2

System.Decimal內部對精度程度敏感相關的事實,SQL的decimal更是如此 - 將其指定爲類型的一部分。

18的縮放比例和28的精度意味着數據庫中小數點後面會有18位有效數字。 (28位精度總數,18點後,離開10點)。

哪個訪問恰好包含在它發送給DAO代碼的表示中。

並且在解析完成時注意到十進制。

因此,你可以看到這一點。

就我個人而言,我認爲這是一個缺陷;任何一位小數都應該表示精度作爲顯式屬性,否則應該隱藏它。也許有一些我無法想到的理由,但沒有想到。

0

小數點按設計存儲這些額外的零。您可以通過四捨五入數到正確的精度可能設置你想要的精確度水平:

myNumber = decimal.Round(myNumber, 2); 

這將小數精度改爲精度爲2(和應用四捨五入)。

+0

但是我怎麼知道我應該設置什麼精度?我有時有2.01的值,有時2.0000001。如何處理這個 – nawfal 2012-01-17 17:03:36

+0

小數的任何比較仍然有效,2.010000將等於2.01。它是否包含任何數量的零不是問題。十進制值甚至會在內存中佔用相同的存儲量。如果您將值轉換爲字符串,則只需執行修剪('0')。 – 2012-01-18 08:41:02

相關問題