数値の小数部分をコンマなしで整数に変換する必要がありました。たとえば、私は3.35を持っています。ゼロまたはコンマなしで35部分だけを取得したいです。C++数値の小数部分を整数に変換する
私は小数部分を抽出するためにmodf()関数を使用しましたが、それを行う方法があれば0.35 が得られます。あなたが私に小さなコードでどのようにできるかを教えていただければ、私はとても感謝しています。
数値の小数部分をコンマなしで整数に変換する必要がありました。たとえば、私は3.35を持っています。ゼロまたはコンマなしで35部分だけを取得したいです。C++数値の小数部分を整数に変換する
私は小数部分を抽出するためにmodf()関数を使用しましたが、それを行う方法があれば0.35 が得られます。あなたが私に小さなコードでどのようにできるかを教えていただければ、私はとても感謝しています。
ここで私はそれをやっています。
私が代わりに二つの異なるistringstream
と
ostringstream
オブジェクトであなただけの1
stringstream
オブジェクトと離れて得ている可能性がありますが、私は詳細について確認していない(そのクラスを使用したことがない)ので、私は」didnのことをかなり確信して
#include <sstream>
#include <string>
int main()
{
double d = yourDesiredNumber; //this is your number
std::ostringstream out;
out << setprecision(yourDesiredPrecision) << std::fixed
<< std::showpoint << d;
std::istringstream in(out.str());
std::string wholePart; //you won't need this.
int fractionalPart;
std::getline(in, wholePart, '.');
in >> fractionalPart;
//now fractionalPart contains your desired value.
}
この例では使用しないでください。
私はこれをしません。それは遅くて損失のあるものです... –
@ RichardJ.RossIII:私はあなたが何をするかを見るために答えを投稿することを正直に待っています。 –
これは私に次の引用を思い出させます - http://bash.org/?946461 –
別ソリューション
int precision= 100;
double number = 3.35;
int f = floor(xx);
double temp = (f - number) * -1;
int fractional_part = temp * precision;
'(f-number)* -1'の代わりに' number-f'はどうですか? –
これは、負の数に対して正しく機能しません。 -0.1は90 – digitalvision
あなたはそれを文字列として必要がある場合は、非常に簡単Cスタイルのソリューションは次のようになり(小数点以下の桁数が可変のために働く必要があります):
double yourNumber = 0.35f;
char buffer[32];
snprintf(buffer, 32, "%g", yourNumber);
strtok(buffer, "."); // Here we would get the part before . , should still check
char* fraction = strtok(NULL, ".");
int fractionAsInt = atoi(fraction);
この例では、欠けています誤った文字列の場合のエラー処理であり、小数点以下の桁数が固定されているだけでは実現できません。
もう少し効率的再度文字列に変換し、より:このような
int fractional_part_as_int(double number, int number_of_decimal_places) {
double dummy;
double frac = modf(number,&dummy);
return round(frac*pow(10,number_of_decimal_places));
}
何か作業をする必要があります:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static int get_frac(double value, unsigned short precision)
{
return (int)((value - (long)value) * pow(10, precision));
}
static int get_frac_no_trailing_zeros(double value, unsigned short precision)
{
int v = get_frac(value, precision);
while (v % 10 == 0)
v /= 10;
return v;
}
int main(int argc, char *argv[])
{
double v;
v = 123.4564;
printf("%.4f = %d\n", v, get_frac(v, 2));
printf("%.4f = %d\n", v, get_frac(v, 4));
printf("%.4f = %d\n", v, get_frac(v, 6));
printf("%.4f = %d\n", v, get_frac_no_trailing_zeros(v, 6));
return EXIT_SUCCESS;
}
あなたはまた、ユーザーを持つことでpow
を呼び出す避けるために、いずれかの場合があります10の威力で数字を入力するか、ルックアップテーブルを使用します。いくつかのSTLの魔法を使用して
、here isサンプルコード:それは改善したが、非常に簡単ですすることができ
typedef std::pair<int, int> SplitFloat;
SplitFloat Split(float value, int precision)
{
// Get integer part.
float left = std::floor(value);
// Get decimal part.
float right = (value - left) * float(std::pow(10, precision));
return SplitFloat(left, right);
}
。
#include <iostream>
#include <cmath>
double round(double r) {
return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5);
}
double floor_to_zero(double f) {
return (f > 0.0) ? std::floor(f) : std::ceil(f);
}
double sign(double s) {
return (s < 0.0) ? -1.0 : 1.0;
}
int frac(double f, int prec) {
return round((f - floor_to_zero(f)) * prec) * sign(f);
}
int main() {
double a = 1.2345;
double b = -34.567;
std::cout << frac(a, 100) << " " << frac(b, 100) << std::endl; // 23 57
}
私はまだかなり新しいですが、あなたがやろうとしていることに近い何かをしました。それほど多かれ少なかれ、私の問題解決のためにここに上陸したとき、これは将来誰かを助けるでしょう。
最初の手順では、3.35を含む変数が2倍であることを確認していますが、それはおそらく明らかです。
次に、整数のみの変数を作成し、その値をdoubleの値と同じに設定します。それはその後、整数だけを含みます。
次に、doubleから整数(int)を減算します。分数/小数の値が残ります。そこから、100を掛けてください。
100分の10進値を超えると、明らかに少し設定する必要がありますが、if文で行うのはかなり簡単です。小数点の値が.99より大きい場合は、代わりに1000を掛けます。
常に小数点以下2桁がありますか? 100倍して整数にキャストするのはどうですか? –
を文字列に書式設定し、小数点以下をすべてコピーするか、最初の数字文字まですべてを削除します。 (それがあなたが必要とするものなら、それをintに変換することができます) – Mordachai
3.35のバイナリ表現は、おそらく '3.349999986f'程度です。 3.350のバイナリ表現は同じです。 3.35と3.350の2つの入力を仮定すると、正確に出力として何を期待していますか? – MSalters