数値を切り上げ、切り捨て、四捨五入する方法を紹介します。
目次
数値の小数以下を切り上げる
数値を整数に切り上げる場合はMathクラスのCeiling静的メソッドを使用するか、decimal構造体Ceiling静的メソッドを使用します。
以下にCeiling静的メソッドを使用する例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 |
// 切り上げ decimal d0 = 123.4m; // MathクラスのCeiling静的メソッドを使用した場合 decimal d1 = Math.Ceiling(d0); // decimal構造体のCeiling静的メソッドを使用した場合 decimal d2 = decimal.Ceiling(d0); |
Ceiling静的メソッドは指定した数値以上の最小の整数値にして返します。
上記のサンプルコードの処理結果は「124」になります。
数値の小数以下を切り捨てる
数値を整数に切り上げる場合はMathクラスのFloor静的メソッドを使用するか、decimal構造体Floor静的メソッドを使用します。
以下にFloor静的メソッドを使用する例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 |
// 切り捨て decimal d0 = 123.4m; // MathクラスのFloor静的メソッドを使用した場合 decimal d1 = Math.Floor(d0); // decimal構造体のFloor静的メソッドを使用した場合 decimal d2 = decimal.Floor(d0); |
Floor静的メソッドは指定した数値以下の最大の整数値にして返します。
上記のサンプルコードの処理結果は「123」になります。
数値の小数以下を四捨五入する
数値を整数に切り上げる場合はMathクラスのRound静的メソッドを使用するか、decimal構造体Round静的メソッドを使用します。
以下にRound静的メソッドを使用する例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 |
// 四捨五入 decimal d0 = 123.4m; // MathクラスのRound静的メソッドを使用した場合 decimal d1 = Math.Round(d0, MidpointRounding.AwayFromZero); // decimal構造体のRound静的メソッドを使用した場合 decimal d2 = decimal.Round(d0, MidpointRounding.AwayFromZero); |
Round静的メソッドは指定した数値を四捨五入した整数値を返します。
Round静的メソッドは第1引数のみ指定して呼び出すと、丸める小数以下の桁数の値が5の時に、最も近い偶数方向に丸められます。(この丸め方を偶数丸め、銀行丸めという。)これは端数処理を行った結果の値を合計する際に誤差が少なくなるため、Round静的メソッド初期動作となっています。
ですので、丸める小数以下の桁数の値が5の時に五入するためにMidpointRounding列挙型のAwayFromZeroを指定してやります。
こうすることで、四捨五入の動作になります。
上記のサンプルコードの処理結果は「123」になります。
指定した小数以下の桁数に切り上げる
数値を指定した小数以下の桁数に切り上げるメソッドはC#に用意されていません。(MathクラスのCeiling静的メソッド、またはdecimal構造体Ceiling静的メソッドで直接処理できません。)ですので、Ceiling静的メソッドを使用する前後に少しだけ操作してやります。
以下に指定した小数以下の桁数に切り上げる例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
//小数第2位を切り上げて小数第1位まで有効にする decimal d0 = 123.45m; d0 = d0 * 10; // MathクラスのRound静的メソッドを使用した場合 decimal d1 = Math.Ceiling(d0); d1 = d1 / 10; // decimal構造体のRound静的メソッドを使用した場合 decimal d2 = decimal.Ceiling(d0); d2 = d2 / 10; |
Ceiling静的メソッドを呼び出す前に、一旦有効にする小数以下の桁数までを整数にします。
そしてCeiling静的メソッドで切り上げ処理を行った後、整数にしていた値を小数に戻します。
上記の例では、小数第1まで有効にするために一旦10を掛けて1234.5にしてからCeiling成績メソッドを呼び出して整数に切り上げし、取得した結果を10で割って小数第1まで有効にした数値を取得しています。
上記のサンプルコードの処理結果は「123.5」になります。
指定した小数以下の桁数に切り捨てる
数値を指定した小数以下の桁数に切り捨てるメソッドは切り上げの場合と同じくC#に用意されていません。(MathクラスのFloor静的メソッド、またはdecimal構造体Floor静的メソッドで直接処理できません。)こちらも切り上げの時と同様にFloor静的メソッドを呼び出す前後に操作してやります。
以下に指定した小数以下の桁数に切り捨てる例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 小数第2位を切り捨てて小数第1位まで有効にする decimal d0 = 123.45m; d0 = d0 * 10; // MathクラスのRound静的メソッドを使用した場合 decimal d1 = Math.Floor(d0); d1 = d1 / 10; // decimal構造体のRound静的メソッドを使用した場合 decimal d2 = decimal.Floor(d0); d2 = d2 / 10; |
処理の方法はCeiling静的メソッドを使った切り上げ処理と同様です。
上記のサンプルコードの処理結果は「123.4」になります。
指定した小数以下の桁数に四捨五入する
数値を指定した小数以下の桁数に四捨五入する場合は整数の場合と同様にRound静的メソッドを使用します。
以下にRound静的メソッドを使用する例をサンプルコードで示します。
1 2 3 4 5 6 7 8 9 |
// 小数第2位を四捨五入して小数第1位まで有効にする decimal d0 = 123.45m; // MathクラスのRound静的メソッドを使用した場合 decimal d1 = Math.Round(d0, 1, MidpointRounding.AwayFromZero); // decimal構造体のRound静的メソッドを使用した場合 decimal d2 = decimal.Round(d0, 1, MidpointRounding.AwayFromZero); |
上記の例では小数第2位を四捨五入して、小数第1位まで有効にしています。
処理結果は「123.5」になります。
サンプルプログラム
ユーザーインターフェース
フォームのUIは以下のようにします。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); numericUpDown1.TextAlign = HorizontalAlignment.Right; numericUpDown2.TextAlign = HorizontalAlignment.Right; numericUpDown3.TextAlign = HorizontalAlignment.Right; numericUpDown1.DecimalPlaces = 3; numericUpDown3.DecimalPlaces = 3; numericUpDown1.Maximum = 99999.999m; numericUpDown3.Maximum = 99999.999m; radioButton1.Checked = true; } private void button1_Click(object sender, EventArgs e) { try { // 切り上げ、切り捨て、四捨五入する数値 decimal num = numericUpDown1.Value; // 切り上げ、切り捨て、四捨五入後の有効な小数桁数 int decimals = (int)numericUpDown2.Value; // 結果の数値 decimal result = 0m; if (radioButton1.Checked) { // 切り上げ result = Ceiling(num, decimals); } else if (radioButton2.Checked) { // 切り捨て result = Floor(num, decimals); } else { // 四捨五入 result = Round(num, decimals); } // 結果を表示 numericUpDown3.Value = result; } catch (Exception ex) { MessageBox.Show(ex.Message); } } // 切り上げ private decimal Ceiling(decimal number, int decimals) { // MathクラスのPow静的メソッドを使用して指定された小数の有効桁数までの整数にする decimal d = (decimal)Math.Pow(10, decimals); decimal value = number * d; value = Math.Ceiling(value); // 整数を小数に戻す return value / d; } // 切り捨て private decimal Floor(decimal number, int decimals) { // MathクラスのPow静的メソッドを使用して指定された小数の有効桁数までの整数にする decimal d = (decimal)Math.Pow(10, decimals); decimal value = number * d; value = Math.Floor(value); // 整数を小数に戻す return value / d; } // 四捨五入 private decimal Round(decimal number, int decimals) { decimal value = Math.Round(number, decimals, MidpointRounding.AwayFromZero); return value; } } } |
実行結果
プログラムを実行して条件を指定して[button1]をクリックすると、切り上げ、切り捨て、四捨五入のいずれかの処理を行った結果が、[結果]のテキストボックスに表示されます。