40


10

浮動小数点数の小数部分を抽出し、小数部分と整数部分を2つの別々の整数変数に格納するにはどうすればよいでしょうか。

13 Answer


80


`+ modf +`関数を使用します:

double integral;
double fractional = modf(some_double, &integral);

整数にキャストすることもできますが、整数をオーバーフローさせる可能性がありますので注意してください。 その結果は予測できません。


41


これを試して:

int main(){double num = 23.345; int intpart =(int)num; double decpart = num  -  intpart; printf( "Num =%f、intpart =%d、decpart =%f \ n"、num、intpart、decpart); }

私にとっては、次のようになります。

Num = 23.345000、intpart = 23、decpart = 0.345000

どちらがあなたが求めているもののようです。


13


「ナットシェルの中で」最も明白な答えは次のように思えます。

#define N_DECIMAL_POINTS_PRECISION (1000) // n = 3. Three decimal points.

float f = 123.456;
int integerPart = (int)f;
int decimalPart = ((int)(f*N_DECIMAL_POINTS_PRECISION)%N_DECIMAL_POINTS_PRECISION);

必要に応じて `+ N_DECIMAL_POINTS_PRECISION +`を変更することにより、必要な小数点の数を変更します。


3


この場合は、文字列を使用するのが正しい方法だと思います。小数部分の桁数が先験的に分からないからです。 しかし、それはすべての場合にはうまくいきません(例: @SingleNegationEliminationで前述したように、1.005)。 これが私の考えです。

#include #include

int main(void){char s_value [60]、s_integral [60]、s_fractional [60];整数i、実測値= 0、カウント= 1、整数、小数。

scanf( "%s"、s_value);

for(i = 0; s_value [i]!= '\ 0'; i){if(!found){if(s_value [i] == '。'){found = 1; s_integral [i] = '\ 0';持続する; } s_integral [i] = s_value [i];カウント  ; else s_fractional [i-count] = s_value [i]; s_fractional [i-count] = '\ 0';

integral = atoi(s_integral);分数= atoi(s_fractional); printf( "値=%s、整数=%d、小数=%d \ n"、s_value、整数、小数);

0を返します。 }


1


ダブルフロートを使用してサブルーチンを作成しました。2つの整数値を返します。

void double2Ints(double f、int p、int * i、int * d){// f = float、p =小数精度、i =整数、d =小数int li; int prec = 1;

(int x = p; x> 0; x--){prec * = 10; ; // power(10、p)と同じ

li =(int)f; //整数部を取得する* d =(int)((f-li)* prec); //小数部を取得する* i = li; }

void test(){double df = 3.14159265; int i、d。 (int p = 2; p <9; p){double2Ints(df、p、


1


私もその方法を考えていました。 しかし、私は方法を見つけました。 このコードを試す

printf( "浮動小数点数を入力"); scanf( "%d%c%d"、

出力:-

浮動小数点数を入力してください23.13数値= 23小数部= 13


0


これは別の方法です:

#include int main(){char * inStr = "123.4567"; //変換したい数値char * endptr; // strtodに未使用のchar ptr

char * loc = strchr(inStr、 '。'); long仮数= strtod(loc 1、endptr); long whole = strtod(inStr、endptr);

printf( "全体:%d \ n"、全体); //整数部printf( "仮数:%d"、仮数); //小数部

}

出力:

全体:123仮数:4567


0


最初の10進数値を取得したいだけであれば、解決策はとても簡単です。

これは説明的な例です:

int leftSideOfDecimalPoint =(int)initialFloatValue; // floatからintへのキャストは整数部分のみを保持します

int temp =(int)initialFloatValue * 10; int rightSideOfDecimalPoint =温度%10。

たとえば、27.8の初期浮動小数点値があるとします。

  • 初期のfloat値をintにキャストするだけで、小数部は破棄され、整数部のみが保持されます。

  • floatの初期値に10を掛けると、278.0という結果が得られます。次に、この結果をintにキャストすると、278という値になります。

  • 278を10で除算すると、27.8が得られます。残りは8で、これは小数点の右側の値です。 したがって、モジュラスを使用してください。

このテクニックを使用すると、10の代わりに100などを使用して、次のような小数点文字を取得できます。

'' '' '

たとえば、7セグメントディスプレイに表示するなど、リアルタイムシステムでこの手法を使用すると、乗算に多くのオーバーヘッド時間がかかる浮動小数点数で乗算しているため、正しく機能しない可能性があります。


0


#include Int main(){float f = 56.75; int a =(int)f; int result =(f-a)* 100; printf( "整数=%d \ n小数部から整数=%d \ n"、結果);出力: - 整数= 56の小数部から整数= 75


0


Aがあなたの整数であるとすると、(int)Aは、その数を整数にキャストすることを意味し、整数部になります。もう一方は(A - (int)A)* 10 ^ nです。 。