programmingNoob
programmingNoob

Reputation: 141

Convert a number from stringstream to string with a set precision

I would like to obtain a number from stringstream and set it to 5 significant figures. How do I do this? So far, this is what I have managed to come up with:

double a = 34.34566535
std::stringstream precisionValue;
precisionValue.precision(6) << a << std::endl;

However, this is not compiling. Thanks.

Upvotes: 4

Views: 19276

Answers (4)

Zyx 2000
Zyx 2000

Reputation: 1705

std::stringstream::precision() returns a streamsize, not a reference to the stream itself, which is required if you want to sequence << operators. This should work:

double a = 34.34566535;
std::stringstream precisionValue;
precisionValue.precision(6);
precisionValue << a << std::endl;

Upvotes: 6

Praetorian
Praetorian

Reputation: 109089

The precision member function returns current precision, not a reference to the stringstream, so you cannot chain the calls as you've done in the snippet.

precisionValue.precision(6);      
precisionValue << a;
std::cout << precisionValue.str() << std::endl;

Or use the setprecision IO manipulator to chain the calls:

precisionValue << setprecision(6) << a;
std::cout << precisionValue.str() << std::endl;

Upvotes: 3

juanchopanza
juanchopanza

Reputation: 227370

You can use std::setprecision from header <iomanip>

#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

int main()
{
  double a = 34.34566535;
  std::stringstream precisionValue;
  precisionValue << std::setprecision(6);
  precisionValue << a << std::endl;
  std::cout << precisionValue.str();
}

Upvotes: 2

jrok
jrok

Reputation: 55395

It doesn't compile because ios_base::precision() returns streamsize (it's an integral type).

You can use stream manipulators:

precisionValue << std::setprecision(6) << a << std::endl;

You'll need to include <iomanip>.

Upvotes: 11

Related Questions