關於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沒有,這就需要使用第四種和第五種方式實現了。

   總之,具體處理方式一定要根據自己的需求來決定,否則可能出現意想不到的結果!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM