Как вывести целочисленные значения без дополнительных нулей после запятой с помощью cout в C ++? - PullRequest
2 голосов
/ 01 февраля 2020

В основном мой код о расчете периметра равностороннего треугольника. Заданы следующие значения:

3
2.5 3 5.15

Первое число определяет количество треугольников, а числа во второй строке - длина стороны каждого треугольника.

Вот мой код:

#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <cstdlib>+
using namespace std;

double Strik(double a);
int main()
{
    int n;
    cin>>n;
    double arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
        for(int i=0;i<n;i++){
        cout<<fixed<<setprecision(2)<<arr[i]<<" "<<Strik(arr[i])<<endl;
    }
    return 0;
}
double Strik(double a){
double s  = ((a*a)*sqrt(3))/4;
 return s;
 }

Кут должен быть таким:

2.5 2.71
3 3.90
5.15 11.48

Но я получаю это:

2.5 2.71
3.00 3.90
5.15 11.48

Пожалуйста помощь

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Вы не можете сделать это только в одном cout утверждении.

Прежде вам понадобится оператор управления, который доказывает, является ли Strik(arr[i]) интегральным значением или нет. С библиотеками C, которые включены в стандартные библиотеки C ++, мы можем сравнить возвращаемое значение функции floorf() в заголовке math.h с фактическим значением Strik(arr[i]) в качестве условия оператора if, как if(floorf(Strik(arr[i])) == Strik(arr[i])) для выполнения sh этой задачи:

Таким образом, относительная часть программы должна выглядеть следующим образом:

for(int i=0;i<n;i++)
{
    if(floorf(Strik(arr[i])) == Strik(arr[i]))
    {
       cout << fixed << setprecision(0) << arr[i] << " " << Strik(arr[i]) << endl;
    }

    else
    {
       cout << fixed << setprecision(2) << arr[i] << " " << Strik(arr[i]) << endl;
    }
}
1 голос
/ 01 февраля 2020

std::setprecision указывает максимальное количество используемых цифр, и если вы хотите получать N цифр все время, вам нужно использовать std::fixed.

#include <iostream>
#include <iomanip>

int main()
{
    double a = 3.5;
    std::cout << std::fixed;
    std::cout << std::setprecision(4);
    std::cout << a << "\n";
    return 0;
}

А теперь вывод равен 3.5000 .

Напротив std::fixed стоит std::defaultfloat, а в первом столбце вам нужно std::defaultfloat, но во втором столбце вам нужно std::fixed, так что для вас это путь к go:

cout << defaultfloat << setprecision(2) << arr[i] << " ";
cout << fixed << Strik(arr[i]) << endl;

Выезд в прямом эфире

Если вам понравился ответ, не забудьте поднять голос и принять его.

ОБНОВЛЕНИЕ

Если, как сказано в одном из комментариев, вы хотите вывести число 13,6, вам нужно увеличить точность следующим образом:

cout << defaultfloat << setprecision(3) << arr[i] << " ";
cout << fixed << setprecision(2) << Strik(arr[i]) << endl;
0 голосов
/ 01 февраля 2020

Вы не можете делать то, что хотите, со стандартными манипуляторами C ++.

Ваши параметры:

  1. << std::fixed << std::precision(2) << устанавливает точное количество десятичных знаков 2
2.50 2.71
3.00 3.90
5.15 11.48
<< std::precision(2) << устанавливает количество значащих цифр в 2
2.5 2.7
3 3.9
5.1 11

Вы можете подумать, что std::setprecision(3) - это решение вашей проблемы, но посмотрите, что произойдет, когда вы попытаетесь напечатать 115.7 :

116

Упс.

Если это действительно важно для вас, единственный способ достичь этого (без огромных хлопот по написанию манипулятора iostream) - выполнить преобразование из двойного -строки себя и постобработать результаты ..

Версия 1: Обрезать все конечные нули

#include <iostream>
#include <strstream>
#include <iomanip>
#include <string>


const std::string trim( double d )
{
   const int places=2;
   std::ostringstream out;
   out << std::setprecision(places) << std::fixed << d;
   std::string s = out.str(); // "3.19" or "5.00" or "212.70"
   s = s.substr( 0,  s.find_last_not_of( "0" )+1 );
   if ( s[s.size()-1]=='.') { s.erase(s.size()-1); }
   return s;
}

 ...

 cout<<trim(arr[i])<<" "<<trim(Strik(arr[i]))<<endl;

Версия 2: Обрезать ".00" из целых чисел, оставив все остальные в место

const std::string trim( double d )
{
   const int places=2;
   std::ostringstream out;
   out << std::setprecision(places) << std::fixed << d;
   std::string s = out.str(); // "3.19" or "5.00" or "212.70"
   if ( s[s.size()-1]=='0' && s[s.size()-2]=='0') { s.erase(s.size()-3); }
   return s;
}
...