C ++中的cout vs printf提供不同的输出

时间:2013-11-20 09:25:13

标签: c++ printf stdin cout

    #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相比如何工作

3 个答案:

答案 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中的更多内容。