#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std ;
int main(){
string name ;
float salary ;
float made ;
cin >> name ;
cin >> salary ;
cin >> made ;
float result = salary + 0.15*made ;
cout<<"TOTAL = R$ "<<setprecision(2)<<result <<endl ;
printf("TOTAL = R$ %.2f\n", result) ;
}
输入: 插口 500.00 1230.00
输出:
TOTAL = R $ 6.8e + 002
TOTAL = R $ 684.50
正确的输出应为684.50。为什么会产生不同的输出?我想知道cout与printf相比如何工作
答案 0 :(得分:7)
500 + 1230 * 0.15
为您提供684.5
,因此cout
仍然正确,因为您只允许两位精度,6
和{{1} }。
如果您希望8
版本的格式与cout
相同,则需要使用printf
:
fixed
更改代码以使用 行代替当前行代码:
cout << "TOTAL = R$ " << fixed << setprecision(2) << result << endl ;
答案 1 :(得分:2)
默认情况下,ostream
使用%g
格式化浮点
格式说明符。您需要告诉它使用%f
,使用:
std::cout.setf( std::ios_base::fixed, std::ios_base::floatfield );
或
std::cout << std::fixed;
更好的解决方案通常是定义特定于应用程序 操纵者,这样你就不指定物理方面了 格式化,而不是逻辑格式,并且改变了 某个逻辑实体的格式可以在一个单独的地方完成 地点。因此,您可以定义:
std::ostream&
salary( std::ostream& dest )
{
dest.setf( std::ios_base::fixed, std::ios_base::floatfield );
dest.precision( 2 );
return dest;
}
然后写:
std::cout << "TOTAL =- R$ " << salary << result << std::endl;
也可以制作操纵器类 析构函数,用于恢复原始格式化状态。
答案 2 :(得分:1)
设置精度会改变有效数字的数量,因此你有两个(68)。
您需要的是由setiosflags(ios::fixed)
设置的定点格式。
正确的代码是:
cout << "TOTAL = R$ " << setiosflags(ios::fixed) << setprecision(2) << result << endl;
guide on output formatting中的更多内容。