mucisk
mucisk

Reputation: 247

c++ double to string shows floating points

I have a string: (66)

Then I convert it to double and do some math: atof(t.c_str()) / 30

then I convert it back to string: string s = boost::lexical_cast<string>(hizdegerd)

Problem is when I show it on label it becomes 2,20000001.

I've tried everything. sprintf etc.

I want to show only one digit after point.

hizdegerd = atof(t.c_str()) / 30;
char buffer [50];
hizdegerd=sprintf (buffer, "%2.2f",hizdegerd);
if(oncekideger != hizdegerd)
{

    txtOyunHiz->SetValue(hizdegerd);

    oncekideger = hizdegerd;
}

Upvotes: 0

Views: 176

Answers (3)

Sceptical Jule
Sceptical Jule

Reputation: 917

Since you wrote "I want to show":

#include<iostream>
#include<iomanip>

int main()
{
    std::cout << std::fixed << std::setprecision(1) << 34.2356457;
}

Output:

34.2

By the way, sprintf is buffer-overflow-vulnerable and is not C++ .

Upvotes: 0

Jerry Coffin
Jerry Coffin

Reputation: 490623

I think I'd wrap the formatting up into a function template, something like this:

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

template <class T>
std::string fmt(T in, int width = 0, int prec = 0) {
    std::ostringstream s;
    s << std::setw(width) << std::setprecision(prec) << in;
    return s.str();
}

int main(){
    std::string s = fmt(66.0 / 30.0, 2, 2);
    std::cout << s << "\n";
}

Upvotes: 1

Alexandru Barbarosie
Alexandru Barbarosie

Reputation: 3002

You can use this way of conversion back to string and then only the wished number of digits for the precision will be taken in consideration:

ostringstream a;
a.precision(x); // the number of precision digits will be x-1
double b = 1.45612356;
a << b;
std::string s = a.str();

Upvotes: 0

Related Questions