正如在對問題的評論中已經指出的那樣,沒有辦法從double中恢復原始輸入,並且最好將其視爲字符串。
問題是,對於9,007,199,254,740,992和更大的值,兩個或多個整數映射到同一個double。雙精度值就是其中之一。
但是,這並不意味着您的應用程序將全部丟失。對於16位和17位數整數,每個雙精度數只映射少數整數。具有相同名稱和不同ID映射到相同雙重的兩個帳戶的機會很低。將double視爲原始ID的單向散列。每次您需要認證並且存儲的雙倍數至少爲9,007,199,254,740,992時,您需要獲取該ID,將其轉換爲雙倍值,並在匹配時接受。您還應該將該ID存儲爲字符串以供將來檢查。
給定一個雙精度值,可以找到多個長度範圍,如果有的話,將映射到轉換的兩倍。如果您需要超出長距離範圍,請改爲使用某種擴展整數類型。不幸的是,我不知道有足夠的C#用它來編寫它。這是一個Java版本:
/*
* Return range of longs that all map to d on conversion, null
* if there is no such long.
*/
private static long[] getLongRange(double d) {
long[] result = new long[2];
long center = (long)d;
if(center != d){
return null;
}
for(long lower = center; (double)lower == d; lower--){
result[0] = lower;
}
for(long upper = center; (double)upper == d; upper++){
result[1] = upper;
}
return result;
}
你可能不能,除非有一個數字會被舍入到你不那麼精確的數字。更大的問題是您將數字標識符視爲數字。你想對它進行數學嗎?不,那不是一個數字。將它作爲字符串存儲,只是因爲所有字符都是數字並不意味着某個數字是數字。 – 2014-12-05 14:52:52
哦! :(是的,我應該首先將它存儲爲一個字符串。謝謝無論如何。 – WeirdElfB0y 2014-12-07 09:16:04