注意:
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.4567, 12345670, 12.34567, 0.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#保留有效数字”,出现诸多优快云中扯淡的东西,天呐……天天摆在那里误导大众,或让某些人认为C#保留个有效数字都这么麻烦……)
还是保留4位。
代码:
var arr = new double[] { 123.4567, 12345670, 12.34567, 0.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;可见数值类型值得装箱、岀箱,值是会有变化的。究其原因,我想大概是值类型存储在栈上,引用类型存储在堆上的原因吧