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

わんくま同盟

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

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

■84101 / 13階層)  有効桁数3桁まででJIS丸めがしたい
□投稿者/ 魔界の仮面弁士 (1280回)-(2017/05/16(Tue) 09:37:09)
No84097 (魔界の仮面弁士) に追記
> 当初の質問の仕様が曖昧になってしまっていますので、
> まずは「正しい仕様」を厳密に定めておくのが先決かと思います。

ついでに、浮動小数点数(IEEE 754-2008)の丸めについても。


浮動小数点数の端数処理は 5 パターンが定義されています。
『最近接丸め(roundings to nearest)』が 2 パターンと
 (1) 偶数丸め (round to nearest, ties to even)
 (2) 0 から遠いほうへ丸め (round to nearest, ties away from zero)
『方向丸め(directed roundings)』が 3 パターンです。
 (3) 0 方向への丸め(RZ) … いわゆる切り捨て (truncation)
 (4) +∞ 方向への丸め(RI) … いわゆる切り上げ (ceiling)
 (5) -∞ 方向への丸め(RP) … いわゆる切り下げ (floor)



1 は二進小数の既定のモードで、十進小数でもこれが推奨されています。
Math.Round の ToEven モードがコレにあたりますし、CInt 等もこの動作です。
「JIS 丸め」「ISO 丸め」「銀行丸め(banker's rounding)」とも呼ばれるモードです。

2 は、Math.Round の AwayFromZero モードに相当します。
先述したように負数の扱いに注意が必要です。

3 は Math.Truncate メソッドや Decimal.Truncate メソッドに相当します。
VB の Fix 関数もそうです。

4 は Math.Ceiling メソッドや Decimal.Ceiling メソッドに相当します。

5 は Math.Floor メソッドや Decimal.Floor メソッドに相当します。
VB の Int 関数もそうです。



これ以外にも、多くの丸め処理があります。
https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86


たとえば業務レベルでは多くの場合、有効桁数で計算する事が一般的であり、時には、
有効桁数の直後の桁だけをみて、切り上げか切り捨てかを判断することが望まれることもあります。


ただ、当初の質問はそうした細かい動作について特に言及されていないため、
JIS 規格の「数値の丸め方」に則った実装にしてみた次第です。


いずれにせよ、一通りの答えは出ていると思いますので、これらを組み合わせることで、
望んでいる端数処理を作り上げることができるのではないでしょうか。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[12]: 有効桁数3桁まででJIS丸めがしたい /魔界の仮面弁士 →Re[14]: 有効桁数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
                  └ Re[10]: 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/13(Sat) 22:04) #84084
                    └ 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
                        └ 有効桁数3桁まででJIS丸めがしたい / 魔界の仮面弁士 (17/05/16(Tue) 09:37) #84101 ←Now
                          └ Re[14]: 有効桁数3桁まででJIS丸めがしたい / AI (17/05/16(Tue) 14:41) #84115 解決済み

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