程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 10進制與62進制互轉 數據大無壓力 10進制與72,96進制任意轉換

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

編輯:C#入門知識

因項目需要把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>
        /// 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>
        /// 一個數據的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://www.cnblogs.com/Lxiaojiang/p/3631371.html

PS: Google的強力封殺,再次讓我憎恨某一類人,某一些事情。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved