Apple IDログイン機能メンテナンスのお知らせ

こんばんは。
タイトルの通り、double型の値を、一桁ずつint型に格納したいのです。

例えば、
double kazu = 123.4
を、
int kurai100 = 1
int kurai10 = 2
int kurai1 = 3
int kurai01 = 4

double kazu = 12.3
を、
int kurai100 = 0
int kurai10 = 1
int kurai1 = 2
int kurai01 = 3

のように格納する関数が欲しいのですが、
どういうふうにやるのが妥当でしょうか。

なんとなく、いったんchar型の配列に変換して、
int型に入れる感じになりそうだとは思うのですが、
double型からchar型にうつす方法がわからないのと、
必ずしも100の位まででなくて、
10の位までしかない場合もあるので、そういう場合、
Char型の配列の添え字がずれるのではと、
悩んでいます。

void henkan(double kazu, &int kurai100, &int kurai10, &int kurai1, &int kurai01)
こういう関数があるといいのですが、どういうふうになるのでしょうか。
使わなかった位には0が入ればいいのですが。

よろしくおねがいします。

A 回答 (7件)

char szNumber[10];


double kazu;
sprintf(szNumber,"%03.1f",kazu);
でdoubleから文字列(char配列)に出来るので、あとは文字を数値に変えれば……
    • good
    • 3
この回答へのお礼

sprintf()で文字列に変換するところまでいきました。
szNumber[10]={1, 2, 3,. , 4}になったとします。

その後これをint kurai100,int kurai10,int kurai1,int kurai0に入れようとするにあたって、char型からint型に変換してやる必要がありますよね。
そこで、atoi()を使うと
kurai100 = atoi(&szNumber[0]);
kurai10 = atoi(&szNumber[1]);
kurai1 = atoi(&szNumber[2]);
kurai01 = atoi(&szNumber[4]);

これで入って欲しいのは、
kurai100=1, kurai10=2, kurai1=3, kurai01=4
なのですが、実際にはatoi()の機能で、
kurai100=123, kurai10=23となってしまいます。

もう一度それを別の文字列に読み込んで、
={1,2,3}
そこからさらに[0]で指定して1だけを取り出した上で、
再度atoi()で変換という方法になったのですが、
もっとうまいやりかたはあるんでしょうか。

しかしとりあえずこれでできたので、
ありがとうございます。

お礼日時:2006/05/02 01:26

そもそも丸め誤差は考えなくていいの?

    • good
    • 0
この回答へのお礼

実際教えていただいた方法でどの程度の誤差がでるのかわからないのですが、100%の精度は求めておらず、見たところうまくうごいているので、今回はこれでいいと思いました。ありがとうございました。

お礼日時:2006/05/03 01:07

もし、扱う値が整数部3桁.小数部1桁またはそれ以下の範囲しかないのであれば、#4または#5の方のやりかたで十分です。



1.234e-5のようなものでも、1, 2, 3, 4を取り出さないといけないのであれば、そんなに単純にはいきません。

どちらなのでしょうか?
    • good
    • 0
この回答へのお礼

今回の場合は、3桁1桁あればいいので、
#4#5でできそうです。
ありがとうございました。

お礼日時:2006/05/03 00:59

ご質問のような処理をする場合、わざわざ文字列にする必要はありません。


それより、整数値からへんかんする方がずっとかんたんだし、わかりやすい。

int i;
double kazu;
int kazu_i;
int kurai[20];
int n;

kazu_i = (int)(kazu * 10);

n = 0;
while(kazu_i != 0) {
kurai[n] = kazu_i % 10;
kazu_i /= 10;
}
    • good
    • 1
この回答へのお礼

まだ動かしてみてないんですが、
これでもできそうですね。
ありがとうございました。

お礼日時:2006/05/03 01:04

単純に



void henkan(double kazu, int *kurai100, int *kurai10, int *kurai1, int *kurai01)
{
*kurai100=(int)kazu/100;
*kurai10=(int)(kazu-*kurai100*100)/10;
*kurai1=(int)(kazu-*kurai100*100-*kurai10*10);
*kurai01=(int)(kazu*10-*kurai100*1000-*kurai10*100-*kurai1*10);
}

じゃダメなんですかね??
3桁+小数1桁なら正確に出てくるとは思うんですが・・
    • good
    • 0
この回答へのお礼

言われてみれば当たり前なのですが、
気が付きませんでした。
今回の場合は、これでも十分です。

ありがとうございました。

お礼日時:2006/05/03 00:59

atoi()は「文字列」を数値に変える関数です。


この場合したいことは「文字」を数値に変えることですから、使えません。

char c = '1';
int n = 1;
printf("%d %d\n",(int)c,n);

がヒントになるかと思います。
    • good
    • 0
この回答へのお礼

丁寧にありがとうございます。
キャストですね。わかりました。

お礼日時:2006/05/03 01:02

関数を作りたいのではなく、欲しいのですね。



でしたら、まずはecvt関数がサポートされているかどうかを調べてください。ecvt関数がサポートされないことがわかってから、自作を考えても遅くはないでしょう。

あるいは、移植性に配慮するのであれば、非標準関数であるecvtは使えませんので、自作も止む無しです。
    • good
    • 0
この回答へのお礼

先ずecvt()あるいはsprintf() で文字列に変換するのですね。ありがとうございました。

お礼日時:2006/05/02 01:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!