準備
(なし)
デザイン
- フォーム (Form1) にボタン (button1) を配置します。
- フォーム (Form1) にリストボックス (listBox1) を配置します。
サンプルコード (C#)
namespace WinFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { // ケース-1 double v1 = 1.44; double v2 = 1.45; listBox1.Items.Add(Math.Round(v1, 1)); listBox1.Items.Add(Math.Round(v2, 1)); listBox1.Items.Add(String.Format("{0:0.0}", v1)); listBox1.Items.Add(String.Format("{0:0.0}", v2)); // ケース-2 double v3 = 1.54; double v4 = 1.55; listBox1.Items.Add(Math.Round(v3, 1)); listBox1.Items.Add(Math.Round(v4, 1)); listBox1.Items.Add(String.Format("{0:0.0}", v3)); listBox1.Items.Add(String.Format("{0:0.0}", v4)); } } }
解説
Math.Round メソッドと、String.Format メソッドの両方で数値を変えて四捨五入しています。どちらとも小数点以下第 1 位の数値になるように計算しています。 ケース-1 と ケース-2 の違いは元となる数値の違いだけです。本来であれば、元となる数値が同じであれば、Math.Round で計算しても String.Format で計算しても同じ結果になるはずですが、結果が違うことがあります。 これは Math.Round メソッドが結果を偶数になるように調整することが原因のようです。常に期待した四捨五入の結果を得たい場合は String.Format メソッドを使うほうがよさそうです。 また、C# と C++/CLI の結果は同じですが、VB.NET では違う結果が出ます。
結果
動作確認環境
Visual Studio 2022 Professional (.NET 7 C#11)
ログ
初版:2016.03.21 Visual Studio 2015 Professional (C# 6.0)