C# 高精度减法 支持小数(待优化)

是现实思路

1,先小数点补位,8913758923475893274958738945793845-4893127498372459823745324532453245.284929384729837498237492 => 8913758923475893274958738945793845.000000000000000000000000-4893127498372459823745324532453245.284929384729837498237492.

2,进行计算,最后补符号

        public static void BuweiF(ref string a, ref string b)
        {
            int al = a.Length;
            int bl = b.Length;
            string[] c = a.Split('.');
            string[] d = b.Split('.');
            int i = al - c[0].Length;
            int j = bl - d[0].Length;
            if (i != 0 && j != 0)
            {
                if (i > j)
                {
                    while (i != j)
                    {
                        b += "0";
                        j++;
                    }
                }
                else
                {
                    while (i != j)
                    {
                        a += "0";
                        i++;
                    }
                }
            }
            else if (i != 0 && j == 0)
            {
                b += ".";
                j++;
                while (i != j)
                {
                    b += "0";
                    j++;
                }
            }
            else if (i == 0 && j != 0)
            {
                a += ".";
                i++;
                while (i != j)
                {
                    a += "0";
                    i++;
                }
            }
            //Console.WriteLine(a);
           // Console.WriteLine(b);
        }
  public static char[] Diff(string a, string b)
        {
            BuweiF(ref a, ref b);
            List<char> item = new List<char>();
            int al = a.Length;
            int bl = b.Length;
            int r = 0;
            int jw = 0;//退位
            bool fushu = false;
            if (al > bl)
            {
                do
                {
                    if (al > 0 && bl > 0)
                    {
                        if (a[al - 1] == '.')
                        {
                            r = '.';
                        }
                        else
                        {
                            r = (int)a[al - 1] - (int)b[bl - 1] - jw;
                            jw = 0;
                            if (r < 0)
                            {
                                r = 10 + r;
                                jw++;
                            }
                        }
                    }
                    else if (al > 0 && bl <= 0)
                    {
                        r = a[al - 1] - 48 - jw;
                        jw = 0;
                        if (r < 0)
                        {
                            r = 10 + r;
                            jw++;
                        }
                    }

                    if (r == 46)
                    {
                        item.Add(Convert.ToChar(r));
                    }
                    else
                    {
                        item.Add(Convert.ToChar(r.ToString()));
                    }
                    al--; bl--;
                } while (al > 0 || bl > 0);
            }
            else if (al < bl)
            {
                fushu = true;
                do
                {
                    if (al > 0 && bl > 0)
                    {
                        if (b[bl - 1] == '.')
                        {
                            r = '.';
                        }
                        else
                        {
                            r = (int)b[bl - 1] - (int)a[al - 1] - jw;
                            jw = 0;
                            if (r < 0)
                            {
                                r = 10 + r;
                                jw++;
                            }
                        }
                    }
                    else if (bl > 0 && al <= 0)
                    {
                        r = b[bl - 1] - 48 - jw;
                        jw = 0;
                        if (r < 0)
                        {
                            r = 10 + r;
                            jw++;
                        }
                    }

                    if (r == 46)
                    {
                        item.Add(Convert.ToChar(r));
                    }
                    else
                    {
                        item.Add(Convert.ToChar(r.ToString()));
                    }
                    al--; bl--;
                } while (al > 0 || bl > 0);
            }
            else
            {
                if (a[0] > b[0])
                {
                    do
                    {
                        if (al > 0 && bl > 0)
                        {
                            if (a[al - 1] == '.')
                            {
                                r = '.';
                            }
                            else
                            {
                                r = (int)a[al - 1] - (int)b[bl - 1] - jw;
                                jw = 0;
                                if (r < 0)
                                {
                                    r = 10 + r;
                                    jw++;
                                }
                            }
                        }
                        else if (al > 0 && bl <= 0)
                        {
                            r = a[al - 1] - 48 - jw;
                            jw = 0;
                            if (r < 0)
                            {
                                r = 10 + r;
                                jw++;
                            }
                        }

                        if (r == 46)
                        {
                            item.Add(Convert.ToChar(r));
                        }
                        else
                        {
                            item.Add(Convert.ToChar(r.ToString()));
                        }
                        al--; bl--;
                    } while (al > 0 || bl > 0);
                }
                else
                {
                    fushu = true;
                    do
                    {
                        if (al > 0 && bl > 0)
                        {
                            if (b[bl - 1] == '.')
                            {
                                r = '.';
                            }
                            else
                            {
                                r = (int)b[bl - 1] - (int)a[al - 1] - jw;
                                jw = 0;
                                if (r < 0)
                                {
                                    r = 10 + r;
                                    jw++;
                                }
                            }
                        }
                        else if (bl > 0 && al <= 0)
                        {
                            r = b[bl - 1] - 48 - jw;
                            jw = 0;
                            if (r < 0)
                            {
                                r = 10 + r;
                                jw++;
                            }
                        }

                        if (r == 46)
                        {
                            item.Add(Convert.ToChar(r));
                        }
                        else
                        {
                            item.Add(Convert.ToChar(r.ToString()));
                        }
                        al--; bl--;
                    } while (al > 0 || bl > 0);
                }
            }
            if (item[item.Count() - 1] == '0' && item[item.Count() - 2] != '.')
            {
                item.RemoveAt(item.Count() - 1);
            }
            if (fushu)
            {
                item.Add('-');
            }
            return item.ToArray();

        }
原文地址:https://www.cnblogs.com/DhyDream/p/4329316.html