Как отобразить фиксированное количество цифр в С++ без округления

У меня есть этот код (очень простой):

#include <iostream>
#include <iomanip>

using namespace std;
int main()
{
float   a = 0.0,
        b = 0.0,
        c = 0.0;

cout<<"Input a: ";
cin>>a;
cout<<"input b: ";
cin>>b;
cout<<endl;
c = a / b;

cout<<"Result: "<<fixed<<setprecision(2)<<c<<endl;
return 0;
}

Когда я ввожу два числа (скажем, a = 513 и b = 791), я получаю 0,65. Калькулятор показывает, что правильный ответ 0,648. Я понимаю, что мой код округляет последнее десятичное число, но это не то, что я хочу.

Как я могу получить его так, чтобы он оставался равным 0,64, а не 0,65?


person user2529011    schedule 03.11.2013    source источник
comment
Вы должны проверить, возвращает ли cin >> a true. В противном случае ввод не выполнен.   -  person Roland Illig    schedule 04.11.2013


Ответы (2)


Если вы хотите усечь значение до двух знаков после запятой, вы можете умножить его на 100, усечь до целого числа, а затем разделить на 100, например:

c = a / b;
c = floor(100 * c) / 100;
cout<<"Result: "<<fixed<<setprecision(2)<<c<<endl;

Демо на ideone.

person Sergey Kalinichenko    schedule 03.11.2013
comment
в какой библиотеке есть усечение, потому что у меня есть cmath в vs 2012, и он не принимает его - person user2529011; 04.11.2013
comment
@user2529011 user2529011 Это <cmath> (см. демо, я добавил для него #include). - person Sergey Kalinichenko; 04.11.2013
comment
Я сделал, и это все еще не принимает его - person user2529011; 04.11.2013
comment
ошибка C3861: 'trunc': идентификатор не найден. Я использую VS2012 BTW. - person user2529011; 04.11.2013
comment
@user2529011 user2529011 А, понятно, std::trunc был добавлен в C++11, а VS 2012 — это не C++11. Вам нужно заменить его на floor (отредактировано и изменено демо). - person Sergey Kalinichenko; 04.11.2013

Вы можете использовать trunc для усечения до определенного количества цифр:

c = a / b;

// truncate past two decimals:
c = trunc(c * 100) / 100;

cout<<"Result: "<<fixed<<setprecision(2)<<c<<endl;

для универсальной функции:

int trunc(double val, int digits)
{
    double pow10 = pow(10,digits);
    return trunc(val * pow10) / pow10;
}

затем используйте

cout << "Result: " << fixed << setprecision(2) << trunc(c,2) << endl;
person D Stanley    schedule 03.11.2013
comment
в какой библиотеке есть усечение, потому что у меня есть cmath в vs 2012, и он не принимает его - person user2529011; 04.11.2013
comment
Или вы можете преобразовать double в int без использования метода trunc. - person ruslaniv; 22.02.2018