2017-04-19 16 views
0

数値の小数点を設定する直接関数はありますか?たとえば、私は3.14341 を得て、私のパラメータは2なので、3.14となる。機能はsetprecisionですが、結果だけが出力されます。また、私はこのようなアルゴリズムを作った:パラメータに応じて10進数を設定します。

std::string fixPrecision(std::string const& value, int digits) 
{ 
    std::string num = value; 
    float temp = std::stof(num); 
    float fractpart, intpart; 
    fractpart = modf(temp, &intpart); 
    int a = (int)(fractpart * pow(10,digits)); 
    double last = intpart + a*(pow(0.1 , digits)); 
    return std::to_string(last); 
} 

それはうまくいく。私は欲しいものを手に入れますが、結果を123.12の代わりに123.120000になるように文字列に変換しなければなりません。

私は確かにここでいくつかの助けを使用することができます。前もって感謝します。

編集:私の関数は文字列形式の整数と戻り値を取る必要があるので、重複する質問ではありません。再度、感謝します。正確

+0

なぜ番号を内部で丸めますか?通常は、表示するときに丸めるだけです。通常、精度を取り除く必要はありません。通貨のようなもので作業している場合は、整数/固定精度のライブラリを使用する必要があります。 – NathanOliver

+0

これは私の仕事です。回答は –

+0

のため、文字列で数値を送るべきです。これは 'std :: stringstream'と' std :: fixed'や 'std :: setprecision'のようなマニピュレータで実現できます。ただし、文字列を直接操作することを検討することをお勧めします。中間の 'float'を使用すると、精度が損なわれる危険性があります。 –

答えて

0

私の愚か者。答えはこれほど簡単です。私は不必要に多くのことをしました...

std::string fixPrecision(std::string const& value, int digits) 
{ 
    auto pos = value.find("."); 
    if(pos != std::string::npos) 
    return value.substr(0, pos+digits+1); 
    return value; 
} 
0

ませんが、あなたは

はメソッド定義のstd ::てSetPrecisionを使って精度を設定することができます好き

void printWithPrecision(const double value, unsigned decimalPlaces) 
{ 
    std::cout << "A Double with " << decimalPlaces <<" decimal places: "<<std::setprecision(decimalPlaces) << value << std::endl; 
} 

をし、それを呼び出す:

double d = 7987.12354689765416; 

for (auto x = 0; x<10; x++) 
{ 
    printWithPrecision(d, x); 
} 

をすることを忘れてはいけません入力/出力マニピュレータを含む:

#include <iomanip> 
+0

回答ありがとうございますが、私はしたくない代わりにそれを印刷して、割り当てたい。 –

+0

しかしそれは二重ですが、それを定義する53ビットを変更することはできません(参照:https://en.wikipedia.org/wiki/IEEE_754-2008) –

+0

は文字列関数があるかもしれません(文字列に変換した後) このため... –

関連する問題