2012-03-26 75 views
1

我有下面的代碼示例:轉換浮到小數,錯誤地失去精度

 float val = 16777216.0F; 
     var badResult = Convert.ToDecimal(val); 
     //badResult has value 16777220 

這是爲什麼呢精密失去了什麼?指定的值是2^24,這是float可以表示的值。是否有任何.net庫可用於使此轉換正常工作,而無需推出自己的iCustomFormatter?

謝謝!

編輯,這是難看的代碼我用作溶液

var goodResult = Convert.ToDecimal(((double)val)); 
+2

如果你在使用數學,一路使用浮動/雙打。如果您使用貨幣,則一路使用小數。爲什麼你需要在它們之間進行轉換? – 2012-03-26 15:58:13

+0

另請參閱http://ideone.com/w1sTm – 2012-03-26 16:00:44

+0

@graham。不幸的是,我正在從硬件返回代碼。 – greggorob64 2012-03-26 17:24:28

回答

3

從文檔System.Single

默認情況下,一個單值僅包含7的精度十進制數字,儘管內部最多保留9位數字。

給出的值對於7位有效數字確實是正確的。儘管float的值實際上是你給出的值,但對於字符串轉換來說,似乎是合理的,只顯示已知是正確的位數,最後一位可能是四捨五入的。

+0

那麼,我發現的臨時解決方案是這樣的: var goodResult = Convert.ToDecimal(((double)val)); 這種轉換工作,但似乎很好,愚蠢。我知道浮點數只適用於7位數字,但此代碼返回正確的值。我可以發生生鏽的代碼嗎? – greggorob64 2012-03-26 17:30:36

+0

@ greggorob64:說實話,我不會開始在'float' /'double'和'decimal'之間轉換。這幾乎總是*一個跡象表明你早先出錯了。雖然我可以理解爲什麼在這個特定案例中起作用,但在我說出它是否會按你想要的做法之前,你需要非常精確地知道你想要在各種角落案件中得到什麼。如果你知道它不值得信任,我不明白你爲什麼要*第8位有效數字。 – 2012-03-26 17:36:51

+0

感謝您的輸入。我有一個傳感器返回一個浮點數(無法控制它),我們需要8個數字的值,因爲如果數字超過1mil,它的一個錯誤代碼,設計和2^24讀出它發出校準。這是他們的糟糕的設計,但我需要將它變成小數點以備將來存儲。 – greggorob64 2012-03-26 17:56:46

1

轉換爲十進制正常工作;問題是float類型(System.Single)無法準確表示此值,所以它實際上是1.677722E+07。如果使用精度更高的doubleSystem.Double),則它將按預期工作。

相關問題