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 

 

 

inserted by FC2 system