2013-11-20 2 views
1
#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соиЬ против Printf в C++ дает другой вывод


Выход:

ИТОГО = R $ 6.8e + 002


TOTAL = R $ 684.50

правый выход должен быть 684.50. Почему он производит разные результаты? Я хочу знать, как COUT работы по сравнению с Printf

+0

Вам необходимо исправить: cout << "TOTAL = R $" << fixed << setprecision (2) << результат << endl; –

ответ

7

500 + 1230 * 0.15 дает 684.5, поэтому cout все еще правильна, так как вы только позволили две цифры точности, в 6 и 8.

Если вы хотите версию cout быть в том же формате, что и printf, вам нужно использовать fixed:

cout << "TOTAL = R$ " << fixed << setprecision(2) << result << endl ; 

Изменения кода для использования что линии вместо вашего текущего дает:

TOTAL = R$ 684.50 
TOTAL = R$ 684.50 
+0

исправлено, спасибо большое – ERJAN

1

Установленная точность изменяет количество значимых чисел, поэтому у вас есть два из них (68).

Для вас нужен формат фиксированной точки, который устанавливается setiosflags(ios::fixed).

Правильный код будет:

cout << "TOTAL = R$ " << setiosflags(ios::fixed) << setprecision(2) << result << endl; 

Более подробно об этом в guide on output formatting.

+0

Я не думаю, что 'std :: setiosflags' определяется, если вы передадите его' ios :: fixed'. Во всяком случае, это не сработает правильно. –

+0

Почему бы не работать правильно? Я тестировал его, и он обеспечивает точно спрошенный результат ... –

+0

С каким компилятором? Или, может быть, вы на самом деле не проверяли его достаточно полно: он не работает с VC++, а не с g ++. Попробуйте установить 'ios_base :: fixed', затем' ios_base :: scientific', затем 'ios_base :: fixed' снова. –

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; 

Это также можно сделать классы манипуляторы с деструктор, который восстанавливает исходное состояние форматирования.

Смежные вопросы