国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# 10進制與62進制互轉 數據大無壓力 10進制與72,96進制任意轉換

2019-11-17 03:05:47
字體:
來源:轉載
供稿:網友

C# 10進制與62進制互轉 數據大無壓力 10進制與72,96進制任意轉換

因項目需要把10進制的ID轉換成62進制的字符串,分享給別人。

于是在網上搜索了很多算法,但都未能滿足需要,項目里的ID是固定算法算出來的18~20位數據的ulong整型。

如:17223472272256398107,509488277152981097。

網上找的算法問題在于,將ulong的值轉換62進制的字符串后,再將字符串轉換成ulong值時會不準確。

于是各種測試與假象問題所在,最后確定算法確實沒有問題,于是開始懷疑數據類型的問題。

果然,原因是使用了Math.Pow(double x,double y)(該方法計算x的y次方的值),double和float的精度只能精確到小數后面7位,但是我算法里沒有用到小數,所以問題應該是在于Pow方法,估計應該是內部實現,可能會以冪的形式來計算,所以如果數據大了,以冪的形式表示超出7位的會出現類似int的計算方法。

所以重新寫了Pow方法,果然問題解決了。重新改寫的方法最大值可以支持到decimal的最大值(79228162514264337593543950335),28位。

理論上是可以支持無限大的數值的,只是要改寫decimal類型。

直接上代碼吧:

  public class Converter    {        PRivate static String keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//編碼,可加一些字符也可以實現72,96等任意進制轉換,但是有符號數據不直觀,會影響閱讀。        private static int exponent = keys.Length;//冪數        /// <summary>        /// decimal value type to 62 string        /// </summary>        /// <param name="value">The max value can not more decimal.MaxValue<</param>        /// <returns>Return a specified 62 encode string</returns>        public static string Decimal2Str(decimal value)//17223472558080896352ul        {            string result = string.Empty;            do            {                decimal index = value % exponent;                result = keys[(int)index] + result;                value = (value - index) / exponent;            }            while (value > 0);            return result;        }        /// <summary>        /// 62 encode string to decimal        /// </summary>        /// <param name="value">62 encode string</param>        /// <returns>Return a specified decimal number that decode by 62 string</returns>        public static decimal Str2Decimal(string value)//bUI6zOLZTrj        {            decimal result = 0;            for (int i = 0; i < value.Length; i++)            {                int x = value.Length - i - 1;                result += keys.IndexOf(value[i]) * Pow(exponent, x);// Math.Pow(exponent, x);            }            return result;        }        /// <summary>        /// 一個數據的N次方        /// </summary>        /// <param name="x"></param>        /// <returns></returns>        private static decimal Pow(decimal baseNo, decimal x)        {            decimal value = 1;////1 will be the result for any number's power 0.任何數的0次方,結果都等于1            while (x > 0)            {                value = value * baseNo;                x--;            }            return value;        }    }

這位朋友的數據類型解說的比較詳細,參見:http://m.survivalescaperooms.com/Lxiaojiang/p/3631371.html

PS: 這段時間Google的強力封殺,只好自己奮發,希望政府能還我們一個開闊、正常的網絡。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万山特区| 武胜县| 霸州市| 丽江市| 高邮市| 嵊州市| 乌苏市| 巴中市| 江达县| 娄烦县| 博湖县| 陵川县| 海兴县| 绥江县| 孟州市| 海宁市| 类乌齐县| 玛多县| 霍山县| 留坝县| 漠河县| 达拉特旗| 屏东县| 高邑县| 沂水县| 花莲市| 泰来县| 青铜峡市| 无棣县| 阳谷县| 靖江市| 延边| 金川县| 巢湖市| 五峰| 巴彦县| 铜鼓县| 锡林浩特市| 灵寿县| 玛多县| 青州市|