注意:

C/C++的输出可能在不同编译器下会有不同结果。如果你的编译器和我的不一样,建议复制C/C++代码并在自己的编译器上运行下看结果。

 

下面所有C#代码由Visual C# 2010 Express编译运行

下面所有C/C++代码由Visual C++ 2010 Express编译运行

 

C++的浮点输出:默认保留6位有效数字

代码:

double arr[4] = { 123.4567, 12345670, 12.34567, 0.001234567 };

 

for(int i=0; i<4; i++)

    cout << arr[i] << endl;

输出:

123.457

1.23457e+007

12.3457

0.00123457

 

 

C#的float是7位,double是15位。可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/dwhawy9k.aspx#GFormatString

注意如果你不用任何格式化符号的话,实际上.NET输出会默认用”G"格式化符来输出。

            var arr = new double[] { 123.45671234567012.345670.001234567 };

 

            foreach (var d in arr)

                Console.WriteLine(d.ToString());

输出:

123.4567

12345670

12.34567

0.001234567

所有数字都是按照原样输出。

 

 

C++保留有效数字可以设置输出流的精度。当然设置精度不限于cout,可以是任何ios_base。这里可以用ios_base.precision函数。或者使用<iomanip>中的setprecision函数。它们都可以达到同样的效果!

 

比如保留4位有效数字。

代码:

double arr[4] = { 123.4567, 12345670, 12.34567, 0.001234567 };

 

cout.precision(4);

for(int i=0; i<4; i++)

    cout << arr[i] << endl;

输出:

123.5

1.235e+007

12.35

0.001235

 

 

C#的话用“G"的精度表示保留有效数字位数我惊奇得发现竟然很多人不知道,在搜索引擎中查找“C#保留有效数字”,出现诸多CSDN中扯淡的东西,天呐……天天摆在那里误导大众,或让某些人认为C#保留个有效数字都这么麻烦……)

 

还是保留4位。

代码:

            var arr = new double[] { 123.45671234567012.345670.001234567 };

 

            foreach (var d in arr)

                Console.WriteLine(d.ToString("G4"));

输出:

123.5

1.235E+07

12.35

0.001235

    double/float数值是通过object类型转换而来的时候,无论赋予object类型的数值是几位小数,最后终会转换出float是7位,double是15位,如下double a=1.5;object objValue=(object)a; double converta=Convert.ToDouble(objValue);则converta会是一位15位小数的数值,它的值会非常接近1.5;而如果double a=1.5;string strValue=a。ToString(); double converta=Convert.ToDouble(strValue);那么converta的值依旧是1.5;可见数值类型值得装箱、岀箱,值是会有变化的。究其原因,我想大概是值类型存储在栈上,引用类型存储在堆上的原因吧