HSP3 プログラミングの基礎W | |
(2) 切り捨て・切り上げ・四捨五入
◎ 切り捨て
実数値を切り捨てる。
;切り捨て
data1 = 123.456
ans0 = double(int(data1))
ans1 = double(int(data1 * 10)) / 10.0
ans2 = double(int(data1 * 100)) / 100.0
mes "data1= " + data1
mes "ans0 = " + ans0
mes "ans1 = " + ans1
mes "ans2 = " + ans2
stop
data1= 123.456000 ans0 = 123.000000 ans1 = 123.400000 ans2 = 123.450000 |
ans0は小数第1位を、ans1は小数第2位、ans2は小数第3位を切り捨てている。
int(実数値)で整数値にして、小数以下を切り捨てる。2行目は次のような計算になる。
int(123.456) = 124
次に、double(整数値)で実数に戻している。
double(int(123.456)) = double(123) = 123.000000
2行目を3, 4行目のような形にすると次のようになる。
ans0 = double(int(data1 * 1)) / 1.0
◎ 切り上げ
実数値を切り上げる。
;切り上げ
data1 = 123.456
ans0 = double(int(data1 + 0.9))
ans1 = double(int(data1 * 10 + 0.9)) / 10.0
ans2 = double(int(data1 * 100 + 0.9)) / 100.0
mes "data1= " + data1
mes "ans0 = " + ans0
mes "ans1 = " + ans1
mes "ans2 = " + ans2
stop
data1= 123.456000 ans0 = 124.000000 ans1 = 123.500000 ans2 = 123.460000 |
ans0は小数第1位を、ans1は小数第2位、ans2は小数第3位を切り上げている。
int(実数値)で整数値にして、小数以下を切り捨てる。2行目は次のような計算になる。
int(123.456+0.9) = int(124.356) = 124
次に、double(整数値)で実数に戻している。
double(int(123.456+0.9)) = double(124) = 124.000000
2行目を3, 4行目のような形にすると次のようになる。
ans0 = double(int(data1 * 1 + 0.9)) / 1.0
◎ 四捨五入
実数値を四捨五入する。
;切り上げ
data1 = 123.456
ans0 = double(int(data1 + 0.5))
ans1 = double(int(data1 * 10 + 0.5)) / 10.0
ans2 = double(int(data1 * 100 + 0.5)) / 100.0
mes "data1= " + data1
mes "ans0 = " + ans0
mes "ans1 = " + ans1
mes "ans2 = " + ans2
stop
data1= 123.456000 ans0 = 123.000000 ans1 = 123.500000 ans2 = 123.460000 |
ans0は小数第1位を、ans1は小数第2位、ans2は小数第3位を四捨五入している。
int(実数値)で整数値にして、小数以下を切り捨てる。2行目は次のような計算になる。
int(123.456+0.5) = int(123.956) = 123
次に、double(整数値)で実数に戻している。
double(int(123.456+0.5)) = double(123) = 123.000000
2行目を3, 4行目のような形にすると次のようになる。
ans0 = double(int(data1 * 1 + 0.5)) / 1.0
◆ 四捨五入関数(round)、べき乗関数(pow)作成
四捨五入する計算式を整理すると、次のようになる。
ans0 = double(int(data1 * 1 + 0.5)) / 1.0
ans1 = double(int(data1 * 10 + 0.5)) / 10.0
ans2 = double(int(data1 * 100 + 0.5)) / 100.0小数第1位を四捨五入
小数第2位を四捨五入
小数第3位を四捨五入↓ ans0 = double(int(data1 * 100 + 0.5)) / 10.00
ans1 = double(int(data1 * 101 + 0.5)) / 10.01
ans2 = double(int(data1 * 102 + 0.5)) / 10.02小数部を0けたにする。
小数部を1けたにする。
小数部を2けたにする。
まず、HSP3にはべき乗を求める演算子や関数がないので作成する。
べき乗関数を作成する。
#module #defcfunc pow double dd, int kk ; ;pow(実数値, 乗数) ; 返却値=double べき乗の値 ; ans = 1 repeat kk ans = ans * dd loop return ans #global repeat 5 mes pow(10.0, cnt) ;cnt = 0, 1, 2, 3, 4 loop stop
1, 10, 100, 1000, 10000の5つの結果が表示される。
四捨五入関数を作成する。
#module #defcfunc pow double dd, int kk ; ;pow(実数値, 乗数) ; 返却値=double べき乗の値 ; ans = 1 repeat kk ans = ans * dd loop return ans ;---------- #defcfunc round double dd, int kk ; ;round(実数値, けた数) ; 返却値=double 四捨五入した値 ; べき乗関数powが必要である。 ; kk1 = pow(10.0, kk) return double(int(dd * kk1 + 0.5)) / kk1 #global ;四捨五入 data1 = 123.456 ans0 = round(data1, 0) ans1 = round(data1, 1) ans2 = round(data1, 2) mes "data1= " + data1 mes "ans0 = " + ans0 mes "ans1 = " + ans1 mes "ans2 = " + ans2 stop
data1= 123.456000 ans0 = 123.000000 ans1 = 123.500000 ans2 = 123.460000 |
return命令に四捨五入の計算式を指定している。
return double(int(dd * pow(10.0, kk) + 0.5)) / pow(10.0, kk) と書くこともできるが、関数powを2回呼び出すことになるので、サンプルのようにしている。
「関数を呼び出すと時間がかかる。」覚えておこう。
2006 © Hiroshi Masuda |