2013-07-05 43 views
0

我有一个字符串:(66)C++双串显示浮点

然后我将其转换为翻一番,做一些数学:​​

然后我将其转换回字符串:string s = boost::lexical_cast<string>(hizdegerd)

问题是当我在标签上显示它变成2,20000001。

我试过了一切。 sprintf等

我想在点后只显示一个数字。

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

    txtOyunHiz->SetValue(hizdegerd); 

    oncekideger = hizdegerd; 
} 
+4

阅读[每个计算机科学家应该知道什么关于浮点运算](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+2

今天是浮点算术。 – devnull

+0

即使阅读[this](http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding)可能会有所帮助。 – devnull

回答

1

我想我会换行格式化了成函数模板,像这样:

#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"; 
} 
0

您可以使用转换这种方式回到string,然后只的数字为精密所希望的数量将考虑采取:

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(); 
0

既然你写了“我想显示”:

#include<iostream> 
#include<iomanip> 

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

输出:

34.2 

顺便提一下,sprintf的是缓冲区溢出脆弱并且不是C++。

+0

嗯,'sprintf'绝对是C++,即使你不赞成它。 –

+0

它是C++ 11的一部分吗? –

+0

是的。你为什么会这么想? –