- ベストアンサー
double型の値を、一桁ずつint型に格納したい
こんばんは。 タイトルの通り、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が入ればいいのですが。 よろしくおねがいします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
char szNumber[10]; double kazu; sprintf(szNumber,"%03.1f",kazu); でdoubleから文字列(char配列)に出来るので、あとは文字を数値に変えれば……
その他の回答 (6)
- UKY
- ベストアンサー率50% (604/1207)
そもそも丸め誤差は考えなくていいの?
お礼
実際教えていただいた方法でどの程度の誤差がでるのかわからないのですが、100%の精度は求めておらず、見たところうまくうごいているので、今回はこれでいいと思いました。ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
もし、扱う値が整数部3桁.小数部1桁またはそれ以下の範囲しかないのであれば、#4または#5の方のやりかたで十分です。 1.234e-5のようなものでも、1, 2, 3, 4を取り出さないといけないのであれば、そんなに単純にはいきません。 どちらなのでしょうか?
お礼
今回の場合は、3桁1桁あればいいので、 #4#5でできそうです。 ありがとうございました。
- moritan2
- ベストアンサー率25% (168/670)
ご質問のような処理をする場合、わざわざ文字列にする必要はありません。 それより、整数値からへんかんする方がずっとかんたんだし、わかりやすい。 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; }
お礼
まだ動かしてみてないんですが、 これでもできそうですね。 ありがとうございました。
- freedom560
- ベストアンサー率46% (80/173)
単純に 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桁なら正確に出てくるとは思うんですが・・
お礼
言われてみれば当たり前なのですが、 気が付きませんでした。 今回の場合は、これでも十分です。 ありがとうございました。
- Trick--o--
- ベストアンサー率20% (413/2034)
atoi()は「文字列」を数値に変える関数です。 この場合したいことは「文字」を数値に変えることですから、使えません。 char c = '1'; int n = 1; printf("%d %d\n",(int)c,n); がヒントになるかと思います。
お礼
丁寧にありがとうございます。 キャストですね。わかりました。
- jacta
- ベストアンサー率26% (845/3158)
関数を作りたいのではなく、欲しいのですね。 でしたら、まずはecvt関数がサポートされているかどうかを調べてください。ecvt関数がサポートされないことがわかってから、自作を考えても遅くはないでしょう。 あるいは、移植性に配慮するのであれば、非標準関数であるecvtは使えませんので、自作も止む無しです。
お礼
先ずecvt()あるいはsprintf() で文字列に変換するのですね。ありがとうございました。
お礼
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()で変換という方法になったのですが、 もっとうまいやりかたはあるんでしょうか。 しかしとりあえずこれでできたので、 ありがとうございます。