zoukankan      html  css  js  c++  java
  • 关于C#的decimal浮点类型转化成字符串时末尾存在多个0

      首先,对于浮点类型,double和float存在精度丢失问题,这一点在之前的一篇博文中有提到(C# double类型精度丢失问题),于是,一般时候推荐大家使用decmal,特别是涉及到一些金融计算时,double和float会让人崩溃的。

      所谓鱼与熊掌不可兼得,decimal有更高的精度,不容易出现精度丢失问题,但是在序列化成字符串时可能会有意想不到的惊喜!  

        static void Main(string[] args)
        {
            decimal @decimal = 6.780000m;
            Console.WriteLine("decimal:" + @decimal.ToString());
    
            double @double = 6.780000d;
            Console.WriteLine("double:" + @double.ToString());
    
            float @float = 6.780000f;
            Console.WriteLine("float:" + @float.ToString());
    
            Console.ReadKey();
        }

      上面的代码执行后

      

         相同的数值,转化成字符串后decimal竟然多了一串0,在多数情况下,这是难以接受的,比如,在页面上展示时,这么多0很影响布局。

       想要去掉这些多余的0,处理办法有很多,一般就是下面几种:    

        static void Main(string[] args)
        {
            decimal @decimal = 0m;
            Console.WriteLine("decimal:" + @decimal.ToString());
            Console.WriteLine("decimal:" + @decimal.ToString("F2"));    //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + decimal.Round(@decimal, 2)); //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + Math.Round(@decimal, 2));    //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + Convert.ToDouble(@decimal)); //转化成double类型在输出
            Console.WriteLine("decimal:" + TrimZeroTail(@decimal));     //自定义方法实现
    
            Console.ReadKey();
        }
        public static string TrimZeroTail(decimal value)
        {
            var str = value.ToString();
            if (str.EndsWith("0"))
            {
                str = str.TrimEnd('0', '.');
                if (string.IsNullOrEmpty(str))
                {
                    return "0";
                }
                while (decimal.Parse(str) != value)
                {
                    str += "0";
                }
            }
            return str;
        }

       输出结果:

      

        需要注意的是,前3中都是四舍五入(对中间数5的舍入方式不一样),这样就需要事先知道保留的小数位数,开发过程中一般都是2位,所以这三种做法是用的最多的。

       第4种是先转换成double后在转化成字符串,这样的效果很好,但是不保证精度问题,毕竟double的小数位没有decimal多。

       第5种就是我们自己写一个实现方法来进行转化,比如上面的TrimZeroTail方法,自己实现能满足我们大部分需求,但是实现不好可能会出现BUG。

       再看例子:  

        static void Main(string[] args)
        {
            decimal @decimal = 6.000000m;
            Console.WriteLine("decimal:" + @decimal.ToString());
            Console.WriteLine("decimal:" + @decimal.ToString("F2"));    //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + decimal.Round(@decimal, 2)); //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + Math.Round(@decimal, 2));    //四舍五入,保留2位小数
            Console.WriteLine("decimal:" + Convert.ToDouble(@decimal)); //转化成double类型在输出
            Console.WriteLine("decimal:" + TrimZeroTail(@decimal));     //自定义方法实现
    
            Console.ReadKey();
        }

      得到结果:

      

         可以看到,前三种方式因为保留小数位的存在,因此无论什么样的数据都会保留小数位,比如上面的0,但是有时候我们希望这个0没有,这就需要使用第四种和第五种方式实现了。

       总之,具体处理方式一定要根据自己的需求来决定,否则可能出现意想不到的结果!

  • 相关阅读:
    学习 TList 类的实现[8]
    System.SetString 获取字符串
    System.Odd 判断一个整数是不是奇数
    问与答[2008331]
    System.Val 将字符串转换为数字
    事件自调用 回复 maxcool 的问题
    JS操作select相关方法:新增 修改 删除 选中 清空 判断存在 等
    自由人生 从容生活
    [引]智能设备开发演练:创建用于设备的 Windows 窗体应用程序
    gentle做的分页控件
  • 原文地址:https://www.cnblogs.com/shanfeng1000/p/13828372.html
Copyright © 2011-2022 走看看