2016-12-05 5 views
0

私が現在行っているプログラムでは、大きな浮動小数点数を格納する必要があります。私は文字列として格納していますが、これは正常に動作しています(もちろん、私は必要な演算子をいくつかオーバーロードしなければなりませんでした)(私は多倍精度算術ライブラリを使用することはできません)。今、私は数字の小数部分を取得し、それを文字列として格納する方法を探しています。私はstringstreamを使用して無視することを考えましたが、それは動作していないようです。これは何もしないので、私のコードに何か間違っていますか?それとも、それを達成するためのいくつかの他の方法は、(私も、ドットまでの流れを反復でしょうループについてその仕事をだろうと考えたのか?)私は何を達成しようとしているが、これを取得することです文字列として格納された数値の小数部を取得する

string toDecimal(string x) 
{ 
string decimalValue; 
stringstream x2(x); 
x2 >> x; 
x2.ignore(100, '.'); //it can have up to 100 places before the dot 
decimalValue = x2.str(); 
cout << decimalValue << end; 
return decimalValue; 
} 

あり:このから

18432184831754814758755551223184764301982441 

:空想stringstreamまたは何を使用せずに

18432184831754814758755551223184764301982441.4321432154 
+5

したがって、部分文字列を先頭から最初のドットに変換したいのですか? 'std :: string :: find'を使ってドットを見つけ、' std :: string :: substr'を使って部分文字列を始めからドット位置に得ることができます。 – michalsrb

+0

通常、 '.'の左側は全体の部分で、' .'の左側は小数部分です。いずれかの場合は、 'find'と' erase'を使って不要な部分を削除してください。 – NathanOliver

+1

@ NathanOliver *右*;) – Quentin

答えて

0

は、あなたが簡単に使用することができます。

char *x = "18432184831754814758755551223184764301982441.4321432154"; 
char *p = x; 
while (*p != '.' && *p != 0) 
    p++; 
*p = 0; 
// now x holds the string until the . 
+0

@AndreaGrilloなぜこの場合、 '* p = 0'の代わりに' 'p ++''がやるのか教えてください。私には何もしておらず、 '.'まで文字列を保持していないようです。 – msrd0

3

c++std::stringクラスを使用してこれを行うこともできます。次のコードは、その実装方法を示しています。

std::string toDecimal(std::string x) 
{ 
    return s.substr(0, s.find(".")); 
} 
0

あなたのメソッドは完全に有効です(私はあなたのメソッドが文字列の小数部分を削除することを理解しましたが、それはあなたのコードとは異なります)。複雑さが増しているにもかかわらず、直線的な掃引をせずにドットの位置を魔法のように見つけることができないので、私はあまり追加できないと思います。それはあなたのアイデアがアルゴリズムそのものに関して十分に良いことを意味します。私は、低レベルの純粋なC実装を使用しているので、msrd0の答えは実行の面でより効率的になると思います。しかし、私はエマニュエルが最高の答えだと思います。メンテナンスが簡単で簡単です。しかし、あなたがしようとしたことに似た何かを主張したり、を実際に使用する場合は、文字列を使用する必要があります。

#include <string> 
#include <iostream> 
#include <sstream> 
#include <algorithm> 

std::string toDecimal(std::string x){ 
    std::string decimalValue; 
    std::reverse(x.begin(), x.end()); 
    std::stringstream x2(x); 
    x2.ignore(100, '.'); 
    x2 >> decimalValue; 
    std::reverse(decimalValue.begin(), decimalValue.end()); 
    std::cout << decimalValue << std::endl; 
    return decimalValue; 
} 

シモンズ:このコードは、文字列内のドットを持っていることを前提としています。

関連する問題