2010-02-12 271 views
1

我做了一個查詢到SQL Server通過存儲過程來得到一些數據,返回值是這樣的:Convert.ToSingle四捨五入

10219150 

然後,在組件(我沒有源代碼該組件的,我所反射的文件以查看代碼)有人這樣寫:

Amount = Convert.ToSingle(10219150); //the value from the stored procedure 

所以,當我調用它執行最終轉化該方法中,它返回這個值:

1.021315E+7 

這怎麼可能?爲什麼Convert.ToSingle添加額外的小數位?我不明白。

當我調用程序集的該方法時,是否有方法可以在我的代碼上反轉該轉換?我不能重寫那個程序集文件,因爲它太大了,而且,正如我之前提到的,我沒有修復轉換的源代碼。

從這:1.021315E + 7要這樣:10219150再次(恢復而沒有轉化爲修正值)

希望我自己清楚。

在此先感謝。

回答

1

轉換爲單個不會增加額外的精度。

10219150是1.021315E + 7(這是另一種寫作方式1.021315 * 10 )。

用於打印出值的方法只是使用科學記數法來顯示數字。

如果您正在打印該號碼,則需要設置formatting options

float amount = Convert.ToSingle("10219150"); 
    string toPrint = string.Format("{0:N}", amount); 

將打印的數量爲:

"10,219,150.00" 

爲了讓沒有小數位使用"{0:N0}"的格式字符串。

+0

這就是我打印的值:String.Format(「{0:0,0}」,Convert.ToDouble(1.021315E + 7)),在正面看起來像這樣:10.219.150.000.000 ??我從來沒有使用過Convert.ToSingle,所以這就是爲什麼我不明白這種行爲。 – lidermin 2010-02-12 12:43:43

+0

非常感謝!你讓我今天一整天都感覺很好。 – lidermin 2010-02-12 13:25:10

0

你有兩個問題。一個很容易解決,另一個可能更困難或不可能。

正如ChrisF所述,1.021315E + 7只是另一種編寫10219150的方法。(科學記數法中的E + 7部分意味着將小數點右移7位)。格式化單精度值時,您可以使用

fvalue.ToString("f0"); 

以整數形式顯示,而不是以科學計數法顯示。

不幸的是,一個更大的問題是,一個精度浮點數只能保存7位有效數字,而在你的例子中你要存儲8個數字。因此,最後一位數可能被舍入。 (因爲在你的情況下它恰好爲0,所以四捨五入可能沒有被注意到。)

如果精度的損失很重要,那麼你很可能需要從數據庫中獲取值作爲long或者作爲雙精度值(取決於返回的數據類型。)這些類型中的每一個都可以保存更有效的數字。

0

當該值轉換爲Single時,它會進行四捨五入,因爲它包含更多有效數字,可以放入Single。如果您將10213153轉換爲Single,那麼您最後也會得到1.021315E+7,即10213150

由於代碼使用Single來存儲金額,因此您無法正確處理當前值。金額根本無法正確表示爲Single

您必須使用較低的值或更改代碼。