關於數值格式化字符串中 "R"(往返程式格式)格式的使用


在數值字符串的格式化中有很多格式化的格式,比如:用"C"表示貨幣格式,用"P"表示百分比格式,FCL中支持多種格式化字符串的方式。有時候我們會把一個數值轉換成string類型,然后再從string類型轉換成數值類型,這時候就要考慮轉換回來后的數值會不會和原來的相等呢?

首先的一種情況:

使用G常規格式來看

using System;
namespace CharStringAndSText
{
    class Program
    {
        static void Main(string[] args)
        {
            //原始字符串
            double originDouble = 0.12314353454478;//14位精度
            float originFloat = 1.222223f;//6位精度
            //轉換成string后
            string originDoubleToString = originDouble.ToString("G");
            string originFloatToString = originFloat.ToString("G");
            //重新轉換成數值后
            double backToDouble = Double.Parse(originDoubleToString);
            float backToFloat = Single.Parse(originFloatToString);
            //結果 
            bool resultDouble = backToDouble.Equals(originDouble);
            bool resultFloat = backToFloat.Equals(originFloat);
            //打印
            Console.WriteLine("ResultDouble is " + resultDouble.ToString() + "with G format"); // 打印結果 : True 
            Console.WriteLine("ResultFloat is " + resultFloat.ToString()+"with G format");  // 打印結果 : True


            Console.ReadKey();
        }
    }
}

當我們把double的精度加到15位的時候,float 加到 7位的時候

using System;
namespace CharStringAndSText
{
    class Program
    {
        static void Main(string[] args)
        {
            //原始字符串
            double originDouble = 0.123143534544786;//15位精度
            float originFloat = 1.2222234f;//7位精度
            //轉換成string后
            string originDoubleToString = originDouble.ToString("G");
            string originFloatToString = originFloat.ToString("G");
            //重新轉換成數值后
            double backToDouble = Double.Parse(originDoubleToString);
            float backToFloat = Single.Parse(originFloatToString);
            //結果 
            bool resultDouble = backToDouble.Equals(originDouble);
            bool resultFloat = backToFloat.Equals(originFloat);
            //打印
            Console.WriteLine("ResultDouble is " + resultDouble.ToString() + " with G format"); // 打印結果 : True 
            Console.WriteLine("ResultFloat is " + resultFloat.ToString()+" with G format");  // 打印結果 : False


            Console.ReadKey();
        }
    }
}

以上結果在我的電腦上顯示,可以看到float類型的數值和原來是不等的。當double類型超過15位的時候,double一般也會不相等;所以這時候可以用R格式來格式化。

using System;
namespace CharStringAndSText
{
    class Program
    {
        static void Main(string[] args)
        {
            //原始字符串
            double originDouble = 0.123143534544786122;//18位精度
            float originFloat = 1.2222234223f;//10位精度
            //轉換成string后
            string originDoubleToString = originDouble.ToString("R");
            string originFloatToString = originFloat.ToString("R");
            //重新轉換成數值后
            double backToDouble = Double.Parse(originDoubleToString);
            float backToFloat = Single.Parse(originFloatToString);
            //結果 
            bool resultDouble = backToDouble.Equals(originDouble);
            bool resultFloat = backToFloat.Equals(originFloat);
            //打印
            Console.WriteLine("ResultDouble is " + resultDouble.ToString() + " with R format"); // 打印結果 : True 
            Console.WriteLine("ResultFloat is " + resultFloat.ToString()+" with R format");  // 打印結果 : True


            Console.ReadKey();
        }
    }
}

這就是往返式格式的用處。但是當我們是用32位計算機編譯的代碼運行在64們的計算機上的時候,用R並不能實現完美轉換,這時候需要用G17來格式化。

根據文檔上寫的 R 符號格式化字符串的時候,首先是使用常規格式對其測試,Double使用15們精度 ,float 使用7位精度 ,如果返回的是和原來相同的值則用G符號。如果不成功,則Double使用17位精度 ,Single使用9位精度。只有Double和Float類型才能使用R格式符。


免責聲明!

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



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