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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C# 10進(jìn)制與62進(jìn)制互轉(zhuǎn) 數(shù)據(jù)大無(wú)壓力 10進(jìn)制與72,96進(jìn)制任意轉(zhuǎn)換

2019-11-17 03:26:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

因項(xiàng)目需要把10進(jìn)制的ID轉(zhuǎn)換成62進(jìn)制的字符串,分享給別人。

于是在網(wǎng)上搜索了很多算法,但都未能滿足需要,項(xiàng)目里的ID是固定算法算出來(lái)的18~20位數(shù)據(jù)的ulong整型。

如:17223472272256398107,509488277152981097。

 

網(wǎng)上找的算法問(wèn)題在于,將ulong的值轉(zhuǎn)換62進(jìn)制的字符串后,再將字符串轉(zhuǎn)換成ulong值時(shí)會(huì)不準(zhǔn)確。

于是各種測(cè)試與假象問(wèn)題所在,最后確定算法確實(shí)沒(méi)有問(wèn)題,于是開(kāi)始懷疑數(shù)據(jù)類(lèi)型的問(wèn)題。

果然,原因是使用了Math.Pow(double x,double y)(該方法計(jì)算x的y次方的值),double和float的精度只能精確到小數(shù)后面7位,但是我算法里沒(méi)有用到小數(shù),所以問(wèn)題應(yīng)該是在于Pow方法,估計(jì)應(yīng)該是內(nèi)部實(shí)現(xiàn),可能會(huì)以?xún)绲男问絹?lái)計(jì)算,所以如果數(shù)據(jù)大了,以?xún)绲男问奖硎境?位的會(huì)出現(xiàn)類(lèi)似int的計(jì)算方法。

 

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

理論上是可以支持無(wú)限大的數(shù)值的,只是要改寫(xiě)decimal類(lèi)型。

直接上代碼吧:

復(fù)制代碼
  public class Converter    {        PRivate static String keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//編碼,可加一些字符也可以實(shí)現(xiàn)72,96等任意進(jìn)制轉(zhuǎn)換,但是有符號(hào)數(shù)據(jù)不直觀,會(huì)影響閱讀。        private static int exponent = keys.Length;//冪數(shù)        /// <summary>        /// ulong 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>        /// 一個(gè)數(shù)據(jù)的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.任何數(shù)的0次方,結(jié)果都等于1            while (x > 0)            {                value = value * baseNo;                x--;            }            return value;        }    }
復(fù)制代碼

 

這位朋友的數(shù)據(jù)類(lèi)型解說(shuō)的比較詳細(xì),參見(jiàn):http://m.survivalescaperooms.com/Lxiaojiang/p/3631371.html

PS: Google的強(qiáng)力封殺,再次讓我憎恨某一類(lèi)人,某一些事情。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河西区| 龙江县| 个旧市| 特克斯县| 会同县| 嵊泗县| 海南省| 洛浦县| 锦屏县| 田东县| 灌云县| 大连市| 陆川县| 京山县| 蕉岭县| 新平| 大丰市| 汉源县| 抚松县| 夏邑县| 平度市| 浠水县| 务川| 巴林左旗| 平塘县| 巴青县| 登封市| 珠海市| 嘉峪关市| 洪江市| 临安市| 淅川县| 乌拉特前旗| 皮山县| 石屏县| 恩施市| 蓬莱市| 于都县| 榆树市| 平湖市| 蒙山县|