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

わんくま同盟

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

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

■84084 / 10階層)  有効桁数3桁まででJIS丸めがしたい
□投稿者/ 魔界の仮面弁士 (1276回)-(2017/05/13(Sat) 22:04:02)
No84081 (hihijiji さん) に返信
> 1.125を小数3位で偶数丸め(JIS丸め)すると1.12になりますが、四捨五入すると1.13になります。
> そこで2回に分けて変換を行って題意に沿った(偶数丸めを行った)回答しました。

2 回に分けると都合が悪いということは、ご自身も示されていますよね。
このことは、JIS Z 8401:1999 「数値の丸め方」にも明記されています。

》 規則 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(2.5D, 2) → 2.5
  JisRound(2.5D, 3) → 2.50
  JisRound(2.5D, 4) → 2.500
のように、小数部の末尾にゼロが付与された値で返却されます。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[9]: 有効桁数3桁まででJIS丸めがしたい /hihijiji →Re[11]: 有効桁数3桁まででJIS丸めがしたい /AI
 
上記関連ツリー

有効桁数3桁まででJIS丸めがしたい / AI (17/05/12(Fri) 14:53) #84065
Re[1]: 有効桁数3桁まででJIS丸めがしたい / Jitta (17/05/12(Fri) 15:18) #84066
│└ Re[2]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/12(Fri) 15:35) #84067
Re[1]: 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/12(Fri) 16:29) #84069
    └ Re[3]: 有効桁数3桁まででJIS丸めがしたい / hihijiji (17/05/12(Fri) 16:17) #84068
      └ Re[4]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/12(Fri) 17:24) #84071
        └ Re[5]: 有効桁数3桁まででJIS丸めがしたい / hihijiji (17/05/12(Fri) 18:17) #84075
          └ Re[6]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/12(Fri) 19:08) #84077
            └ Re[7]: 有効桁数3桁まででJIS丸めがしたい / hihijiji (17/05/13(Sat) 10:31) #84079
              └ Re[8]: 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/13(Sat) 11:14) #84080
                └ Re[9]: 有効桁数3桁まででJIS丸めがしたい / hihijiji (17/05/13(Sat) 11:40) #84081
                  └ 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/13(Sat) 22:04) #84084 ←Now
                    └ Re[11]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/15(Mon) 18:03) #84093
                      ├ Re[12]: 有効桁数3桁まででJIS丸めがしたい / furu (17/05/15(Mon) 18:25) #84094
                      │└ Re[13]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/16(Tue) 14:39) #84114
                      └ Re[12]: 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/15(Mon) 19:44) #84097
                        └ Re[13]: 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/16(Tue) 09:37) #84101
                          └ Re[14]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/16(Tue) 14:41) #84115 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信