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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.84084 の関連記事表示

<< 0 >>
■84084  Re[10]: 有効桁数3桁まででJIS丸めがしたい
□投稿者/ 魔界の仮面弁士 -(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
    のように、小数部の末尾にゼロが付与された値で返却されます。
記事No.84065 のレス /過去ログ143より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -