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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值