2014-12-05 21 views
0

變更的原始號碼(Facebook用戶ID)我開發了一個應用程序,其中用戶的Facebook名稱和用戶ID被保存爲一個身份驗證系統。查找通過雙數據類型舍入C#

我將這些ID作爲雙值存儲在C#腳本中。但事實證明,Facebook用戶的新ID超過15位,這是沒有四捨五入的雙數據類型的限制(我在開發時並不知道,哎!)。所以數字四捨五入,數值急劇變化。有趣的是,圓形的數字是位,他們是不是誰登錄的用戶的真實用戶ID。

我改變了代碼後,我才意識到這個錯誤,但有沒有辦法找出用戶誰已經登錄過。

我想知道我是否可以從我現在擁有的16位數圓整雙數中找到原始數字?我都是耳朵。

+3

你可能不能,除非有一個數字會被舍入到你不那麼精確的數字。更大的問題是您將數字標識符視爲數字。你想對它進行數學嗎?不,那不是一個數字。將它作爲字符串存儲,只是因爲所有字符都是數字並不意味着某個數字是數字。 – 2014-12-05 14:52:52

+0

哦! :(是的,我應該首先將它存儲爲一個字符串。謝謝無論如何。 – WeirdElfB0y 2014-12-07 09:16:04

回答

1

正如在對問題的評論中已經指出的那樣,沒有辦法從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; 
    } 
+0

感謝這個提示'哈希'的東西。:)這是有希望的。讓我檢查它是否有效。 – WeirdElfB0y 2014-12-07 09:29:12