2013-10-05 35 views
0

我想添加一行的單元格並在網格中的新單元格中顯示總數。我正在使用DevExpress的gridControl。網格有12列代表一年中的月份,我想添加月份值並在第13列中顯示總數。c#添加浮點數的行爲很奇怪

我的問題是,如果我有一個浮點值「111,22」,它將作爲「111,2188」添加到數據庫中,並在第13個單元格中沒有精度顯示。

所以,我有兩個問題。第一個是「爲什麼它會將它作爲111,2188插入到數據庫中?」第二個是「爲什麼顯示總數」。

這裏是我的代碼......發生這種情況時,我加111,2188和200,我也得到211,2188 ....

private void calculate_gv_row_total(int row_index) { 
    float total = 0; 
    for (int j = 0; start_index + j < start_index + months; j++) 
    { 
     float f = float.Parse(gv.GetDataRow(row_index)[start_index + j].ToString()); 
     total = total + f; 
    } 
    gv.GetDataRow(row_index)[total_cell_index] = total; 

} 

如何解決這些問題呢?我究竟做錯了什麼?

+1

嘗試,有很多的'Decimal'數據類型 –

+1

愚弄「我真的不明白'float'手段」的問題。見http://csharpindepth.com/Articles/General/FloatingPoint.aspx和http://csharpindepth.com/Articles/General/Decimal.aspx –

+0

@ayilmaz,似乎你實施了錯誤的解決方案.. – Tauseef

回答

4

實際上,您的網格效率很高,它會將111,2188舍入到111,22。如果您想查看確切的值,請增加列寬或告訴網格精度級別。

如果你並不需要那麼多的精度使用ToString("F")

private void calculate_gv_row_total(int row_index) { 
    float total = 0; 
    for (int j = 0; start_index + j < start_index + months; j++) 
    { 
     float f = float.Parse(gv.GetDataRow(row_index)[start_index + j].ToString("F")); 
     total = total + f; 
    } 
    gv.GetDataRow(row_index)[total_cell_index] = total; 

} 
1

正如Jon Skeet在評論中所說,問題是 - 坦率地說 - 你對浮體的理解。浮點僅使用32位來存儲必須轉換爲十進制值的二進制浮點值。這會導致您正在經歷的「怪異」值。

最簡單的解決方法通常是使用雙打。但請務必閱讀浮動廣告以及爲什麼它們不能很好地代表10位數字。