在c++中没有**std::fixed**的**std::set precision()**有什么作用?

问题描述 投票:0回答:4

如教程所示http://www.cplusplus.com/reference/iomanip/set precision/

// setprecision example
#include <iostream>     // std::cout, std::fixed
#include <iomanip>      // std::setprecision

int main () {
  double f =3.14159;
  std::cout << std::setprecision(5) << f << '\n';  // prints 3.1416 and not 3.141459 why 
  std::cout << std::setprecision(9) << f << '\n';
  std::cout << std::fixed;
  std::cout << std::setprecision(5) << f << '\n';
  std::cout << std::setprecision(9) << f << '\n';
  return 0;
}

std::cout << std::setprecision(5) 不会打印 5 位十进制数字,但在设置 std::fixed 后,设置精度按预期工作。这是为什么 ?。

没有 std::fixed std::set precision() 的作用是什么?

c++ c++11 stl precision iomanip
4个回答
9
投票

根据http://en.cppreference.com/w/cpp/io/ios_base/ precision,精度决定打印多少位,而不是打印浮点数后多少位:

std::ios_base::precision

管理浮点数的精度(即生成多少位数字) 点输出

这解释了舍入。

是的,使用

std::fixed
将改变浮点字段精度的解释。根据http://www.cplusplus.com/reference/ios/ios_base/ precision/

无论是固定计数法还是科学计数法,精度域 准确指定小数点后显示多少位数字, 即使这包括尾随小数零。前面的数字 在这种情况下,小数点与精度无关。


6
投票

精度的含义取决于是否使用固定格式、科学格式或默认格式。对于固定格式,它是小数点后的位数。对于科学来说,也是如此 - 但小点之前总是有一位数字;指数用于将小数点移动到位。对于默认格式,精度指定打印的总位数(粗略地;有点复杂)。

有关详细信息,请参阅 http://en.cppreference.com/w/cpp/io/c/fprintf ,特别是

%f
%e
%g
格式说明符的说明(用于固定、科学和相应的默认格式)。
std::cout << f
被指定为就像调用
printf("%.<precision><format>", f)
一样(达到第一个近似值;实际情况再次有点复杂,但细节与当前问题无关),其中
<precision>
setprecision
指定的数字,
<format>
f
e
g
之一。


6
投票

std::setprecision()
的行为因所选格式而异。

std::fixed
使
std::setprecision()
指小数点后打印多少位。在将默认格式更改为
std::fixed
之前,已设置
std::defaultfloat
,并且
std::setprecision()
设置要打印的总位数,包括小数点之前和之后的位数。

比较:

http://www.cplusplus.com/reference/ios/defaultfloat/

http://www.cplusplus.com/reference/ios/fixed/


2
投票

这是因为

当浮点字段设置为固定时,使用定点表示法写入浮点值:该值的小数部分位数与精度字段(精度)指定的位数完全相同,并且没有指数部分。

文档

© www.soinside.com 2019 - 2024. All rights reserved.