🌻🌼実数を含む計算式の計算結果を整数値で表示する方法 解🌼🌻

おめでとう 実数値の数値計算の実行結果を整数値表示にするカールトンさんの問題も解決しました 解その1 キャスト演算子を用いる場合



             😊おめでとう😊


           実数値の数値計算の実行結果を


      整数値表示にするカールトンさんの問題も解決しました 解その1      


           キャスト演算子を用いる場合





清美「


#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%f円です。\n",10000*a);

return 0;

}


プログラムの実行結果(統合開発環境EAZY IDECの場合)


あなたの預金額はただいま10499.999523円です。



プログラムの実行結果(統合開発環境Visual Studioの場合)


あなたの預金額はただいま10500.000000円です。




このプログラムの実行結果(統合開発環境EAZY IDECの場合)を


キャスト演算子をもちいて


あなたの預金額はただいま10500円です。


と表示させてみるね。」



清美「マジカルソースコード変形~~~第1形態💖


#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%d円です。\n",(int )(10000*a));

return 0;

}


プログラムの実行結果(統合開発環境EAZY IDECの場合)


あなたの預金額はただいま10499円です。


プログラムの実行結果(統合開発環境Visual Studioの場合)


あなたの預金額はただいま10500円です。



清美「このようにキャスト演算子を用いると


プログラムの実行結果(統合開発環境EAZY IDECの場合)を


あなたの預金額はただいま10499.999523円です。


から


あなたの預金額はただいま10499円です。



変更させることができるんだよ


でも

(int )(10000*a)の部分を


(int )10000*aと記述して


ソースコードを構成すると


#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%d円です。\n",(int )10000*a);

return 0;

}


プログラムの実行結果


あなたの預金額はただいま0円です。


となるんだ


なぜなら


(int )10000*aの(int )は10000*a全体にかかるのでなくて


10000だけにかかる


つまり


整数値10000を整数値10000に変更したことになるんだよ


だから


(int )10000*aは


結局


整数値10000に実数値の型float型の変数a(に格納されている実数値)をかけることになるから


整数値10000の数値の型変換がおこり


整数値10000は実数値の型(の形式でメモリ)に格納し直されることになります


(int )10000*aは


実数値×実数値


となるので


(int )10000*aの計算結果は実数値になります。


だから


printf("あなたの預金額はただいま%d円です。\n",(int )10000*a);


を実行すると


実数値を%d出力変換指定子を使ってprintf出力表示するということになり


プログラムの実行結果は


あなたの預金額はただいま0円です。


と表示されることになるんだね。


だから


(int)10000*aではなく


(int)(10000*a)


と記述するんだね。」


聡子「清美ちゃん すんご~いい\(^o^)/」


清美「まだまだ~😊


10000*a=10499.999523の状態で


キャスト演算子(int)をこのように


(int)(10000*a)


と用いた場合


10499.999523は整数値に型変換される


整数値の型int型の形式でメモリに格納し直されることになるので



10499.999523の小数点以下の項は切り捨てられて


(int)(10000*a)=10499


になるんだよ~

(EAZY IDECの場合)


そう


💖小数点以下の項は四捨五入でなく切り捨てられるんです💖


これが


キャスト演算子のシステムなんだ~きゃはっ


だから


このままでは


プログラムの実行結果を


あなたの預金額はただいま10500円です。


と表示することはできない。


どうしよ~ってなるよね~


聡子ちゃん なんとかして~


きゃっ きゃっ💖💖💖 」


聡子 「ええっ!?」


聖美 「はいぃ?」


清美「実はキャスト演算子を使って


プログラムの実行結果


あなたの預金額はただいま10499.999523円です。



あなたの預金額はただいま10499円です。


でなく


あなたの預金額はただいま10500円です。


に変更する


いい方法があるのです。


それは次のプログラムなの。


マジカルソースコード変形~~~第2形態~~~~~💖



#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));

return 0;

}


プログラムの実行結果(EAZY IDECの場合)


あなたの預金額はただいま10500円です。



プログラムの実行結果(Visual Studioの場合)


プログラムをデバッグなしで実行すると


いったん

警告 C4305 '=': 'double' から 'float' へ切り詰めます。 Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 5


と表示されますが


あなたの預金額はただいま10500円です。


と表示されます。


聖美「おお すご~い


なんでかわからないけれど


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a));


から


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));


に変更しただけで


プログラムの実行結果が


あなたの預金額はただいま10499円です。


から


あなたの預金額はただいま10500円です。


に変更されてる!」


聡子「(int)(10000*a+0.5))の中の0.5がミソみたいね。」


清美「実数値を含む計算式の計算結果は実数となるので


実数値を含む計算式の計算結果は


かならず小数点以下の数値を含みます


このとき


             😊小数点以下第1位😊


は次の数値達のように0から9のいずれかの値をとるよね。


(👇小数点以下第1位に注目してください)

7.000000

323.0234

1.111

6.23444555

5.3346

2.4555

3.54567

4.688888

1.74

2.8686

2.9999

などなど・・・



このままではわかりにくいので


ここでは


小数点以下第1位が


5

6

7

8

9


となっている実数値


10499.5

10499.6

10499.7

10499.8

10499.9



小数点以下第1位が


0

1

2

3

4


となっている実数値


10500.0

10500.1

10500.2

10500.3

10500.4


についてかんがえてみるね


今は10000*aの計算結果は(EAZY IDECの場合)


10499.999523

だったから


10000*a=10499.999523

👇

10499.5

10499.6

10499.7

10499.8

10499.9

10000*a=10499.999523👈このあたりの数値

10500.0

10500.1

10500.2

10500.3

10500.4

👆


このように


これらの実数値の真ん中あたりの大きさの実数値


となるの



これらの



実数値をキャスト演算子(int)をつけてprintf出力表示すると



#include <stdio.h>


int main(void)

{

printf("%d\n",(int )10499.5);

printf("%d\n",(int )10499.6);

printf("%d\n",(int )10499.7);

printf("%d\n",(int )10499.8);

printf("%d\n",(int )10499.9);

printf("%d\n",(int )10499.999523);

printf("%d\n",(int )10500.0);

printf("%d\n",(int )10500.1);

printf("%d\n",(int )10500.2);

printf("%d\n",(int )10500.3);

printf("%d\n",(int )10500.4);

return 0;

}


プログラムの実行結果(EAZY IDECの場合)

プログラムの実行結果(Visual Studioの場合)


10499

10499

10499

10499

10499

10499👈printf("%d\n",(int )10499.999523);の実行結果です

10500

10500

10500

10500

10500


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 2703348) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...



が表示されるの



このプログラムでは


キャスト演算子(int)を


10499.5

10499.6

10499.7

10499.8

10499.9

10000*a=10499.999523👈このあたりの数値

10500.0

10500.1

10500.2

10500.3

10500.4

に用いることにより


10499.5

10499.6

10499.7

10499.8

10499.9

10000*a=10499.999523👈このあたりの数値

10500.0

10500.1

10500.2

10500.3

10500.4


小数点以下の部分が切り捨てられているよね。


これらの数値に0.5を足した


10499.5+0.5

10499.6+0.5

10499.7+0.5

10499.8+0.5

10499.9+0.5

10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値

10500.0+0.5

10500.1+0.5

10500.2+0.5

10500.3+0.5

10500.4+0.5


すなわち


10500.0

10500.1

10500.2

10500.3

10500.4

10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値

10500.5

10500.6

10500.7

10500.8

10500.9



以下のように

👇

(int)(10500.0)

(int)(10500.1)

(int)(10500.2)

(int)(10500.3)

(int)(10500.4)

(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値

(int)(10500.5)

(int)(10500.6)

(int)(10500.7)

(int)(10500.8)

(int)(10500.9)

👆

キャスト演算子(int)を作用させると


小数点以下の項は切り捨てられ


(int)(10500.0)

(int)(10500.1)

(int)(10500.2)

(int)(10500.3)

(int)(10500.4)

(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値

(int)(10500.5)

(int)(10500.6)

(int)(10500.7)

(int)(10500.8)

(int)(10500.9)



10500

10500

10500

10500

10500

10500

10500

10500

10500

10500

10500


を表すことになります


実際に


10500.0

10500.1

10500.2

10500.3

10500.4

10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値

10500.5

10500.6

10500.7

10500.8

10500.9



キャスト演算子(int)をつけてprintf出力表示すると

👇

#include <stdio.h>


int main(void)

{

printf("%d\n", (int)(10499.5 + 0.5));

printf("%d\n", (int)(10499.6 + 0.5));

printf("%d\n", (int)(10499.7 + 0.5));

printf("%d\n", (int)(10499.8 + 0.5));

printf("%d\n", (int)(10499.9 + 0.5));

printf("%d\n", (int)(10499.999523 + 0.5));

printf("%d\n", (int)(10500.0 + 0.5));

printf("%d\n", (int)(10500.1 + 0.5));

printf("%d\n", (int)(10500.2 + 0.5));

printf("%d\n", (int)(10500.3 + 0.5));

printf("%d\n", (int)(10500.4 + 0.5));

return 0;

}


プログラムの実行結果(EAZY IDECの場合)

プログラムの実行結果(Visual Studioの場合)


10500

10500

10500

10500

10500

10500

10500

10500

10500

10500

10500


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 2707212) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...



と表示されます。




そう


(int)(10500.0)

(int)(10500.1)

(int)(10500.2)

(int)(10500.3)

(int)(10500.4)

(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値

(int)(10500.5)

(int)(10500.6)

(int)(10500.7)

(int)(10500.8)

(int)(10500.9)




   💖💖💖小数点以下の項が切り捨てられた整数値10500💖💖💖をあらわしているの


キャスト演算子(int)によって


実数値データがint型にキャスト(実数値データがint型に搭載)されるとき



       🌞実数値型の形式でメモリに格納されている🌞



             🌞実数値データは🌞



       🌞整数値型の形式でメモリに格納し直され🌞



             🌞整数値データとなるの🌞


簡単にいえば


実数値データの小数点以下の部分が切り捨てられて整数値データとなるのね


だから


10499.5

10499.6

10499.7

10499.8

10499.9

10000*a=10499.999523👈このあたりの数値

10500.0

10500.1

10500.2

10500.3

10500.4



0.5


を足して


10499.5+0.5

10499.6+0.5

10499.7+0.5

10499.8+0.5

10499.9+0.5

10499.999523(10000*a)+0.5=10500.499523👈このあたりの数値

10500.0+0.5

10500.1+0.5

10500.2+0.5

10500.3+0.5

10500.4+0.5


としたものに


 キャスト演算子(int)を


(int)(10499.5+0.5)

(int)(10499.6+0.5)

(int)(10499.7+0.5)

(int)(10499.8+0.5)

(int)(10499.9+0.5)

(int)(10499.999523(10000*a)+0.5)=(int)(10500.499523)👈このあたりの数値

(int)(10500.0+0.5)

(int)(10500.1+0.5)

(int)(10500.2+0.5)

(int)(10500.3+0.5)

(int)(10500.4+0.5)         

         

👆

このように作用させるという この方法を用いれば


10499.5

10499.6

10499.7

10499.8

10499.9

10000*a=10499.999523👈このあたりの数値

10500.0

10500.1

10500.2

10500.3

10500.4


のような


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データは


全部


10500


と表示されるんだよ


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データが


10500


になるって


まるで


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データが


四捨五入されて


10500


になったみたいね」


聖美「あっ ほんとね」


清美「


先程のプログラムにおいては

👇

#include <stdio.h>


int main(void)

{

float a;

a=1.05;


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));

return 0;

}


プログラムの実行結果


あなたの預金額はただいま10500円です。

(統合開発環境EAZY IDECの場合)


👆


10000*a=10499.999523(統合開発環境EAZY IDECの場合)


となるんだけど


10000*a=10499.999523は


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データだよね


だから


10000*aに0.5が加えられた


10000*a+0.5=10499.999523+0.5=10500.499523


(10499.500000・・・に0.5を足した)

10500.000000・・・

から

(10500.499999・・・に0.5を足した)

10500.999999・・・


に収まる範囲の数値データとなります


そして


10500.000000・・・

から

10500.999999・・・


に収まる範囲の数値データ



キャスト演算子(int)を作用させると


小数点以下の部分が切り捨てられて


10500


となるね


同様に


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データの小数点以下第1位が四捨五入されても


小数点以下の部分が切り捨てられて


10500


となるね


つまり


10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データに0.5を足して


キャスト演算子(int)を作用させた時に得られるデータ



10499.500000・・・

から

10500.499999・・・・・・


に収まる範囲の数値データを四捨五入した時に得られるデータ



等しくなるんだね



つまり


一般的に


元の実数値に0.5をたして


キャスト演算子(int)を作用させたときに得られるデータ



元の実数値の小数点以下第一位を四捨五入して得られるデータ



等しくなるの


つまり


実数値の小数点以下第一位を四捨五入したい場合は


実数値に0.5をたして


キャスト演算子(int)を作用させればよいということになるの」


聡子「うわあ 感心(*´▽`*)」



清美「えへ



お話は戻って


10499.500000・・・+0.5

10000*a+0.5すなわち10499.999523+0.5

10500.499999・・・+0.5


すなわち


10500.000000・・・

10000*a+0.5すなわち10499.999523+0.5

10500.999999・・・


にキャスト演算子(int)を作用させた


(int)(10500.000000・・・)

(int)(10000*a+0.5)すなわち(int)(10499.999523+0.5)

(int)(10500.999999・・・)



小数点以下の項が切り捨てられ


10500

10500

10500


を表すことになります


このことは


10499.500000・・・

10000*aすなわち10499.999523

10500.499999・・・



小数点以下第一位を四捨五入することになるの




ですので


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));


が実行されると


あなたの預金額はただいま10500円です。



printf出力表示されるの







あまり重要ではないかもしれないけど


ここでの注意点は


             10000*aが


10000*a=10499.999523



10499.500000・・・

から

10500.499999・・・・・・


の範囲内の数値データになっているということかな?


もし


             10000*aの計算結果が


10499.999523

でなく


10000*a=10599.5となったりすると


10000*a=10599.5は


10499.500000・・・

から

10500.499999・・・・・・


の範囲外の実数値になっちゃうので


10000*aに0.5を足したものは


10500.000000・・・

から

10500.999999・・・・・・


の範囲外の実数値になっちゃうの


10500.000000・・・

から

10500.999999・・・・・・


の範囲外の実数値に


キャスト演算子(int)を作用させて


小数点以下の部分を切り捨てても


すなわち


10499.999999・・・

より小さい実数値

もしくは

10501.000000・・・

より大きい実数値


キャスト演算子(int)を作用させて


小数点以下の部分を切り捨てても


10500


にならならなくなります


いいかえるならば


10000*a=10599.5


の小数点以下第一位を四捨五入しても


10600となるのです


10500にはなりませんね



10599.5に0.5を足したものに


キャスト演算子(int)を作用させて


printf("あなたの預金額はただいま%d円です。\n",(int)(10000*a+0.5));


を実行しても


あなたの預金額はただいま10600円です。


と表示されて


あなたの預金額はただいま10500円です。



表示されることはありません


あなたの預金額はただいま10500円です。


が表示されるためには


そもそも



             10000*aが


10499.500000・・・

から

10500.499999・・・・・・


の範囲内の数値であるというところがポイントなんだね」



聡子「わぁ ほんとだ~」



聖美「絶好調じゃな~い。清美」





  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る