C++打印浮点数

q1qsirdb  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(173)

有没有一个最好的方法来打印浮点数(我用长双精度)?我已经尝试了几种方法,但似乎没有一种对所有类型的数字都有效。
让我举例说明。
我有三份打印声明。

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

字符串
下面是print(const long double &n)的一些实现的结果:
简单COUT

cout << n << endl;

3.14159 // not good
1.234 // good
1.234e-10 // good


精密COUT

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


还有一些其他的可能性与'科学',而不是固定的,但这显然是不可取的。

j8yoct9x

j8yoct9x1#

问题是有些十进制数不能用二进制精确表示,就像1.0 / 3.0没有精确的十进制表示一样,1.0 / 10.0也没有精确的二进制表示。
因此,对于计算机来说,十进制中没有明确的“自然表示”或“尽可能多的数字”的概念。
当您在代码中输入0.1时,它实际上将由内存中最接近的二进制值表示。

mccptt67

mccptt672#

你可以像这样使用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

csbfibhn

csbfibhn3#

C++20提供了std::format,它为您提供了最短的十进制表示,并具有往返保证和正确的舍入:

#include <format>
#include <cmath>
#include <iostream>

int main() { 
  std::cout << std::format("{}\n", M_PI);
  std::cout << std::format("{}\n", 1.234);
  std::cout << std::format("{}\n", 1.234e-10);
}

字符串
输出量:

3.141592653589793
1.234
1.234e-10


如果std::format在你的标准库实现中还不可用,你可以使用它所基于的the {fmt} library

免责声明:我是{fmt}和C++20 std::format的作者。

nx7onnlm

nx7onnlm4#

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

ios_base& myway (ios_base& str){

}

字符串

相关问题