2015-09-25 55 views
8

我已經讀過不同的帖子在stackoverflow和C#文檔,轉換long(或任何其他數據類型代表一個數字)到double失去精度。由於浮點數的表示,這是非常明顯的。精度損失轉換爲雙倍有多大?

我的問題是,如果我將大數轉換爲double,精度的損失有多大?我是否期望差異大於+/- X?

我想知道這個的原因是我必須處理連續的計數器,它是一個long。我的應用程序將此值讀取爲string,需要投射並且必須除以例如。 10或其他一些小號碼,然後進一步處理。

decimal會更適合這項任務嗎?

+0

好吧'decimal'當然可以將所有信息保存在'long'中......但它確實不清楚您的要求是。 –

+0

@JonSkeet實際上沒有,我知道如何用小數解決它,但問題或多或少地出於好奇。我需要多少精確的損失。 – John

回答

8

轉換long(或任何其他數據類型代表數字)到double失去精度。由於浮點數的表示,這是非常明顯的。

這似乎並不明顯,因爲精確度損失取決於long的值。對於-2 和2 之間的值,根本沒有精度損失。

如果我將更大的數字轉換爲雙倍,精度的損失有多大?我有期待的差異比+/- X

大得多,數量與幅度超過2 你會遇到一些精度損失,這取決於你有多少上面的52位限制去。如果您的long的絕對值符合比如58位,那麼精度損失的幅度將是58-52 = 6位或+/- 64。

decimal會更適合這項工作嗎?

decimaldouble有不同的表示形式,它使用不同的基數。既然你打算用「小數字」來劃分你的電話號碼,不同的表示會給你分配上不同的錯誤。具體而言,double將更好地處理兩個權力的分割(2,4,8,16等),因爲這種分割可以通過從指數中減去而不觸及尾數來完成。同樣,大的decimal s將不會受到有效數字的損失,除以十,一百等。

+0

完美!我認爲這個計算會給我精確度損失,但不確定。損失實際上比我預期的要小。謝謝! – John

3

long

long是一個64位的整數類型,並且可以從-9,223,372,036,854,775,808保存值9,223,372,036,854,775,807(最多19個位數)。

double

double是具有15至16位精度64位浮點型。所以如果你的數字大於100,000,000,000,000,數據肯定會丟失。

decimal

decimal是一個128位小數類型,並且可以容納多達28-29個數字。所以將long轉換爲decimal總是安全的。

建議

我會建議你瞭解你將要工作的人數的準確預期。然後,您可以在選擇適當的數據類型時做出明智的決定。既然你是從一個字符串中讀取你的數字,他們不可能超過28位數字嗎?在這種情況下,列出的所有類型都不適用於您,而您必須使用某種BigInt實現。

+0

可以肯定的是,它不會超過long的範圍。感謝你的回答! – John