目录
使用说明(略读)
std::fixed 常搭配 std::setprecision(3) 使用
std::fixed
和 std::setprecision(n)
在一起使用时,通常是为了精确控制输出浮点数的小数部分的显示格式。
-
std::fixed
指定输出的是固定小数点格式,这意味着无论数值大小,都会按照小数点后的位数来显示,不会因为数值太大或太小而采用科学计数法表示。 -
std::setprecision(n)
设置输出的小数部分精度为n
位。它定义了在输出流中显示的最少有效数字数,包括小数点后的数字。
因此,当你既想固定小数点,并且希望小数点后保留特定数量的数字时,通常会同时使用这两个操纵符。例如:
std::cout << std::fixed << std::setprecision(3) << some_float_value;
std::fixed
是C++标准库iomanip中的一个操纵符,用于设置输出流(如cout或stringstream ss)中浮点数的显示方式。当在输出流中使用了std::fixed
后,浮点数会被格式化为固定小数点模式。这样可以确保输出的浮点数具有确定且固定的精度。
举例说明(细读)
“如果不使用 std::fixed,即使设置了精度,编译器也可能根据数值大小自动选择最佳的浮点数表示方式,不一定是固定的小数位数 ” 我们来举个例子。
例子1:仅使用 std::setprecision(n)
#include <iostream>
#include <iomanip>
int main() {
double large_number = 123456789.123456;
std::cout << std::setprecision(3) << large_number << std::endl;
double small_number = 0.0000012345;
std::cout << std::setprecision(3) << small_number << std::endl;
}
在这段代码中,虽然我们指定了std::setprecision(3)
,但没有使用std::fixed
,编译器可能对每个数值采用不同的输出策略:
- 对于大数
large_number
,由于数值较大,输出可能会自动调整为类似1.23e+08
这样的科学计数法格式,尽管小数部分仍然保留了3位精度。 - 对于小数
small_number
,可能会得到类似于1.235e-06
的科学计数法表示,同样保持了小数点后3位精度,但并非固定小数点形式。
例子2:同时使用 std::fixed
和 std::setprecision(n)
#include <iostream>
#include <iomanip>
int main() {
double large_number = 123456789.123456;
std::cout << std::fixed << std::setprecision(3) << large_number << std::endl;
double small_number = 0.0000012345;
std::cout << std::fixed << std::setprecision(3) << small_number << std::endl;
}
在此情况下,由于添加了std::fixed
,所有数值都将严格按照小数点后保留3位的格式输出:
large_number
将被显示为123456789.123
,没有采用科学计数法。small_number
将被显示为0.000
,同样精确到小数点后3位,即便实际结果显示为0,也会保持固定的小数点形式。
总结来说,std::fixed
确保了浮点数始终以固定的小数位数格式显示,而不受其绝对值大小的影响。