-2

是否有一种打印浮点数的最佳方法(我使用的是长双打)?我尝试了几种方法,但似乎没有一种方法适用于所有类型的数字。

让我来说明一下。

我有三个打印语句。

print(M_PI); // from cmath
print(1.234);
print(1.234e-10);

以下是一些 print(const long double &n) 实现的结果:

简单的输出

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

“科学”而不是固定的还有其他几种可能性,但这显然是不可取的。

4

3 回答 3

1

问题是一些十进制数字不能完全用二进制表示。就像 没有精确的十进制表示一样, (也称为)也1.0 / 3.0没有精确的二进制表示。1.0 / 10.00.1

所以对于计算机来说,十进制中没有明确的“自然表示”或“尽可能多的数字”的概念。

当您输入0.1代码时,它实际上将由内存中最接近的二进制值表示。将此二进制值转换回十进制(这总是可能的)产生0.1000000000000000055511151231257827021181583404541015625

于 2013-03-28T10:47:05.337 回答
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
于 2013-03-28T10:54:20.310 回答
-1

实现一个方法,该方法接受一个流,按照你喜欢的方式改变它并输出它

ios_base& myway (ios_base& str){

}
于 2013-03-28T10:28:47.547 回答