C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■84093 / )  Re[11]: 有効桁数3桁まででJIS丸めがしたい
□投稿者/ AI (6回)-(2017/05/15(Mon) 18:03:08)
No84084 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん、ご回答ありがとうございます!

> 》 規則 A,B を 2 回以上使って丸めることは,誤差の原因となる。
> 》 したがって,丸めは,常に 1 段階で 行わなければならない。
> 》 例 12.251 は,12.3 と丸めるべきであって,まず 12.25 とし,次いで 12.2 としてはならない。
>
> 規則 A はいわゆる偶数丸め、規則 B は四捨五入のことです。
> VB でいえば
>
>   規則 A … System.Math.Round(Decimal値, 小数部桁数, System.MidpointRounding.ToEven)
>   規則 B … System.Math.Round(Decimal値, 小数部桁数, System.MidpointRounding.AwayFromZero)
>
> にあたりますので、JIS丸めで例示されている 12.251 →12.3 は規則B(四捨五入)のことですね。
>
>
> ひとまず、規則 A / 規則 B の双方に対応した、
> 『有効桁数』での丸め処理を作ってみました。
>
> No84065 で示された要件は満たしていると思います。
> (例2 については、 No84069 で指摘したように記載ミスであると想定)
>
>
> ''' <param name="digits">有効桁数(1〜29)</param>
> Function JisRound(value As Decimal, Optional digits As Byte = 3, Optional mode As MidpointRounding = MidpointRounding.ToEven) As Decimal
>   digits = Math.Max(1, Math.Min(29, digits))
>   Dim fmt As String = StrDup(digits - 1, "#"c) & "0." & StrDup(29, "0"c) & "E0"
>   Dim s() As String = value.ToString(fmt).Split("E"c)
>   Dim a As Decimal = Math.Round(CDec(s(0)), 0, mode)
>   Dim b As Integer = CInt(CDec(s(1)))
>   Return CDec(String.Format("{0:0}E{1:D}", a, b))
> End Function

JisRound関数の作成、どうもありがとうございます。

作成いただいた「JisRound」について、
テストさせていただいたのですが、少し気になる事がありました。

1. JisRound(1.11495, 3) → 1.11 ※No84079の値で確認
2. JisRound(1.125 , 3) → 1.12 ※No84081の値で確認
3. JisRound(12.251 , 3) → 12.3 ※No84084の値で確認
4. JisRound(12.25 , 3) → 12.2

となってしまいます。

1と2では欲しい結果になっていると思いますが、
3と4で両方の結果が異なる理由がよく分かりません。
おそらく「12.2」になれば正解だと思うのですが...
この値を求める事はできないのでしょうか。

試しに、以下のコートを実行してみました。
System.Math.Round(12.251, 1, System.MidpointRounding.ToEven) → 12.3
System.Math.Round(12.25 , 1, System.MidpointRounding.ToEven) → 12.2

アドバイスの程、どうぞよろしくお願いします。


返信 編集キー/


管理者用

- Child Tree -