2013-05-17 2 views
8

Я пытаюсь сделать простой вывод в форматированном тексте. Setprecision не печатает мои переменные до двух знаков после запятой.C++ setprecision (2) печать одного десятичного знака?

Например, если firstItemPrice = 2,20, выход 2,2 вместо 2,20

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main() 
{ 

    string firstitem = ""; 
    string seconditem = ""; 
    double firstItemNum;  
    double firstItemPrice = 0.00; 
    double secondItemNum; 
    double secondItemPrice = 0.00; 

    //first item 
    cout << "Enter the name of Item 1: "; 
    getline(cin, firstitem); 
    cout << "Enter the number of " << firstitem << "s and the price of each: "; 
    cin >> firstItemNum >> firstItemPrice; 
    cin.ignore(); 

    //second item 
    cout << "Enter the name of Item 2: "; 
    getline(cin, seconditem); 
    cout << "Enter the number of " << seconditem << "s and the price of each: "; 
    cin >> secondItemNum >> secondItemPrice; 


    cout << left << setw(20) << "Item" << setw(10) << "Count" 
    << setw(10) << "Price" << left << "\n"; 

    cout << setw(20) << "====" << setw(10) << "====" << setw(10) 
    << "====" << left << "\n"; 

    cout << setw(20) << firstitem << setw(10) 
    << firstItemNum << setw(10) << setprecision(2) 
    << firstItemPrice << "\n"; 

    cout << setw(20) << seconditem << setw(10) << secondItemNum 
    << setprecision(2) << secondItemPrice << left << "\n"; 


    return 0; 
} 
+0

Ваш код в порядке. Я скомпилировал его. Он работает нормально. Он печатает два десятичных знака. Возможно, вы захотите попробовать другой компилятор. –

ответ

11

Вам нужен fixed там, чтобы сделать это.

cout << fixed; 

Установите его обратно с помощью:

cout.unsetf(ios_base::floatfield); 

В вашем случае изменения последнего бита вашей программы как этот пример должен это сделать:

cout << setw(20) << firstitem << setw(10) 
<< firstItemNum << setw(10) << fixed << setprecision(2) 
<< firstItemPrice << "\n"; 

cout.unsetf(ios_base::floatfield); 

cout << setw(20) << seconditem << setw(10) << secondItemNum 
<< fixed << setprecision(2) << secondItemPrice << left << "\n"; 

Editorial в сторону: Не используйте числа с плавающей запятой для представления значений валюты.

+0

, чтобы узнать, почему плавать плохо для финансового расчета. Http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency и http: // ru. wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries – fduff

+0

+1 для редакции о том, что вы не используете с плавающей запятой. – hochl

2

от http://www.cplusplus.com/reference/ios/ios_base/precision/

Точность с плавающей точкой определяет максимальное количество цифр должны быть записаны на вставки операций, чтобы выразить значения с плавающей точкой. То, как это интерпретируется, зависит от того, установлен ли флаг формата floatfield на определенную нотацию (фиксированную или научную) или он не установлен (используя стандартную нотацию, которая не обязательно эквивалентна ни фиксированной, ни научной).

Для локали по умолчанию: Использование по умолчанию обозначения с плавающей запятой, точность поле указывает максимальное количество значимых цифр для отображения в общем подсчете как те, до и те, после запятой. Обратите внимание, что это не минимально, и поэтому он не заполняет отображаемый номер конечными нулями, если число может отображаться с меньшим количеством цифр, чем точность. В фиксированных и научных обозначениях поле точности задает точное количество цифр, которые будут отображаться после десятичной точки, даже если это включает в себя завершающие десятичные нули. Цифры до десятичной точки не имеют значения для точности в этом случае.

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