by DarkSky » 2006年5月17日(水) 04:13
丁度今作っているアプリケーションの中で、似たような関数を使っていたので、稚拙ながらも参考になればと思います。
皆さん文字列の事話し合われてるのに、僕だけ数字の事で恐縮ですが・・・。
Ketaはどの桁まで有効にするかで、Keta+1桁目で切り捨て、切り上げ、四捨五入、五捨六入、JIS丸めを行います。
・・・五捨六入とかJIS丸めとか今まで知らなかったのですが、
Wikipedia:端数処理で調べて、面白そうなので付け加えました。勉強になります。
コード: 全て選択
Function RoundDown (dbl As Double, Keta As Long, Mode As Long) As Double
If dbl = Int(dbl) Then
RoundDown = dbl
Exit Function
End If
dbl = dbl*10^Keta
Select Case Mode
Case 1'切り捨て
dbl = Int(dbl)
Case 2'切り上げ
If dbl - Int(dbl) >= 0.1 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 3'四捨五入
If dbl - Int(dbl) >= 0.5 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 4'五捨六入
If dbl - Int(dbl) >= 0.6 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 5'JIS丸め
If dbl - Int(dbl) > 0.5 Then
dbl = Int(dbl+1)
ElseIf dbl - Int(dbl) < 0.5 Then
dbl = Int(dbl)
Else
If Int(dbl) mod 2 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
End If
End Select
dbl /= 10^Keta
RoundDown = dbl
End Function
これまたWikipediaより、対応確認表です。長くなってしまいすみません。
コード: 全て選択
#prompt
Dim A As Double
Print "元値","切捨","切上","四五","五六","JIS"
A=8.05
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.15
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.25
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.26
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.34
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.35
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.45
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
大半は問題なかったのですが、8.26の五捨六入のときがおかしいです。
82.6-Int(82.6)=0.599999999999994となってしまい、切り捨てられるようです。どうすればいいのでしょう?
こんなに遅くまで起きて考え事してると流石に眠くなりますね。
丁度今作っているアプリケーションの中で、似たような関数を使っていたので、稚拙ながらも参考になればと思います。
皆さん文字列の事話し合われてるのに、僕だけ数字の事で恐縮ですが・・・。
Ketaはどの桁まで有効にするかで、Keta+1桁目で切り捨て、切り上げ、四捨五入、五捨六入、JIS丸めを行います。
・・・五捨六入とかJIS丸めとか今まで知らなかったのですが、[url=http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86]Wikipedia:端数処理[/url]で調べて、面白そうなので付け加えました。勉強になります。
[code]
Function RoundDown (dbl As Double, Keta As Long, Mode As Long) As Double
If dbl = Int(dbl) Then
RoundDown = dbl
Exit Function
End If
dbl = dbl*10^Keta
Select Case Mode
Case 1'切り捨て
dbl = Int(dbl)
Case 2'切り上げ
If dbl - Int(dbl) >= 0.1 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 3'四捨五入
If dbl - Int(dbl) >= 0.5 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 4'五捨六入
If dbl - Int(dbl) >= 0.6 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
Case 5'JIS丸め
If dbl - Int(dbl) > 0.5 Then
dbl = Int(dbl+1)
ElseIf dbl - Int(dbl) < 0.5 Then
dbl = Int(dbl)
Else
If Int(dbl) mod 2 Then
dbl = Int(dbl+1)
Else
dbl = Int(dbl)
End If
End If
End Select
dbl /= 10^Keta
RoundDown = dbl
End Function
[/code]
これまたWikipediaより、対応確認表です。長くなってしまいすみません。
[code]
#prompt
Dim A As Double
Print "元値","切捨","切上","四五","五六","JIS"
A=8.05
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.15
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.25
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.26
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.34
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.35
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
A=8.45
Print A,RoundDown(A, 1, 1),RoundDown(A, 1, 2),RoundDown(A, 1, 3),RoundDown(A, 1, 4),RoundDown(A, 1, 5)
[/code]
大半は問題なかったのですが、8.26の五捨六入のときがおかしいです。
82.6-Int(82.6)=0.599999999999994となってしまい、切り捨てられるようです。どうすればいいのでしょう?
こんなに遅くまで起きて考え事してると流石に眠くなりますね。