有没有一种最好的方法来打印浮动(我使用长双打)?我尝试了几种方法,但它们似乎都不适用于所有类型的数字。
让我举例说明。
我有三份印刷文件。
print(M_PI); // from cmath
print(1.234);
print(1.234e-10);
这些是print(const long double& n)的一些实现的结果:
SIMPLE COUT
cout << n << endl;
3.14159 // not good
1.234 // good
1.234e-10 // good
精确度
cout.precision(numeric_limits<long double>::digits10);
cout << n << endl;
3.14159265358979312 // good
1.23399999999999999 // bad
1.23400000000000008e-10 // not good
具有固定精度的COUT
cout.precision(numeric_limits<long double>::digits10);
cout << fixed << n << endl;
3.141592653589793116 // good
1.233999999999999986 // bad
0.000000000123400000 // not good
还有其他几种可能与'科学'而不是固定,但这是不可取的。
答案 0 :(得分:1)
问题是某些十进制数字不能完全用二进制表示。就像1.0 / 3.0
没有确切的十进制表示一样,1.0 / 10.0
(也称为0.1
)没有确切的二进制表示。
因此,对于计算机来说,十进制中没有明确的“自然表示”或“尽可能多的数字”的概念。
当您在代码中输入0.1
时,它实际上将由内存中最接近的二进制值表示。将此二进制值转换回十进制(这总是可能完全可能)会产生0.1000000000000000055511151231257827021181583404541015625
答案 1 :(得分:1)
你可以使用printf或sprintf:
float p1 = 1.234;
float p2 = 1.234e-10;
float p3 = M_PI;
printf("%.5g - %.5g - %.5g", p1, p2, p3);
输出:
1,234 - 1,234e-10 - 3,1416
答案 2 :(得分:-1)
实现一种方法,该方法根据您的喜好对流进行更改并输出
ios_base& myway (ios_base& str){
}