2017-08-05 71 views
1

我試圖將一串長度的數字轉換爲一個double,以便將其用作redis數據庫的索引(redis需要雙精度型),但轉換不是正確,以便數據庫抓取變得混亂。c#中的Convert.ToDouble在訪問redis數據庫時沒有給出正確答案

這裏是一個字符串轉換成一個雙

string start="636375529204974172"; 
ulong istart = Convert.ToUInt64(start); // result 636375529204974172 
double dstart = Convert.ToDouble(istart); // result 6.3637552920497421E+17 

,你可以看到,當我ISTART轉換爲雙象DSTART,一些最顯著位被搞砸的問題開始的代碼,似乎通過在那裏引入E + 17的轉換。

我不明白爲什麼,它的一個整數,沒有小數部分來創建錯誤,爲什麼它不能做到這一點?

有誰知道如何解決從字符串轉換爲雙?

+0

我也這麼認爲,但同時我只是用E + 17所以它應該工作的右雙去E + 308 ? –

+0

嘗試使用「十進制」更精確 – edtheprogrammerguy

+0

爲什麼十進制更精確的雙精度? – jdweng

回答

4

我不明白爲什麼,它的一個整數,沒有小數部分來創建錯誤,爲什麼它不能做到這一點?

由於它仍然只有64位信息可供使用,其中52個用於尾數,其中11個用於指數,其中1個用於符號。

基本上你不應該依賴double中精度超過15個十進制數字。來自docs for System.Double

所有浮點數的有效數字位數也是有限的,這也決定了浮點值接近實數的精確程度。 Double值最多有15個十進制數字的精度,但內部最多保留17位數字。

您的值的前15位有效數字是 correct - 這裏沒有任何問題。最近double價值,你的原始值恰好是636375529204974208.有沒有double這恰恰代表636375529204974172.

+1

theres總是有些東西搞砸了,我的整個程序使用了 –

+0

我想出的解決方案是從當前日期時間滴答減去2017年1月1日的滴答數,這創建了一個更小的滴答大小,然後我用而不是 –

+0

@PaulMan:如果你正在處理ticks,你不能使用整數類型嗎?或者Redis僅支持浮點值? –

相關問題