切り捨てと切り上げと四捨五入 C#
paizaのスキルチェックで、割り算の結果を切り上げしたかったのですが、デフォルトだと切り捨てとなってしまい、分からずじまいだったので調べました。
今回解いた問題は、スキルチェックといって問題集とは違い、問題を載せてしまうと規約違反なので載せれません;;
前提として
int a =3/2
と入力すると、自動的に切り捨てとなり、1が帰ってきてしまいます。
今回は切り上げた結果が返ってほしいため、これは困った、、、。
色々やり方はあると思うのですが、次のやり方が一番簡単でした。
int a = Convert.ToInt32(Math.Ceiling((double)3/2));
この出力結果は2となります。
Convert.ToInt32は、指定した値を 32 ビット符号付き整数に変換し、
Math関数は、一つまたは二つの引数を与え,それぞれの関数に対応した計算値を返すものです。
Math関数の後ろにある関数は、今回の場合のようなCeilingであれば切り上げ、Floor であれば切り捨て、Roundであれば四捨五入されます。
①切り上げ
int a = Convert.ToInt32(Math.Ceiling((double)3/2));→2
②切り捨て
int a = Convert.ToInt32(Math.Floor((double)3/2));→1
③四捨五入
int a = Convert.ToInt32(Math.Round((double)3/2));→2
調べていて疑問点が二つほど。
int a = Convert.ToInt32(Math.Floor((double)3/2));って、言ってしまえば
int a =3/2とやってること同じだし、切り捨てって必要なのか?
と、
Roundは第2パラメータに何も指定しなければ、『銀行丸め』という、4.5や6.5など、小数点がちょうど半分の0.5の時は、偶数側が優先され、4や6と切り捨てして出力されてしまう。と書いてあったことです。
別名『偶数丸目』!こっちのが覚えやすいですな。
まぁ前者は一旦置いときましょう。
後者のRound関数なんですが、paizaでは、
int a = Convert.ToInt32(Math.Round((double)9/2));
上記のコードはしっかりと四捨五入されて5と出力されました。
環境によって違うのかな?paizaだと四捨五入してくれるようになっているのでしょうか?優しいですね!
補足として、銀行丸めになってしまった場合のコードも載せておきます。
int a = Convert.ToInt32(Math.Round((double)9/2,MidpointRounding.AwayFromZero));
つまり環境によっては、
③四捨五入 銀行丸め
int a = Convert.ToInt32(Math.Round((double)9/2));→4
④四捨五入
int a = Convert.ToInt32(Math.Round((double)9/2,MidpointRounding.AwayFromZero));→5
と、いうことであってるのかな?
間違ってたら申し訳ないです;;
後、銀行丸めって銀行家が好んで用いたことからその名がついたらしいですヨ!偶数丸めの方が覚えやすいなぁ( ´∀` )
今回学べたこと
①切り上げ
int a = Convert.ToInt32(Math.Ceiling((double)3/2));→2
②切り捨て
int a = Convert.ToInt32(Math.Floor((double)3/2));→1
③四捨五入(銀行丸め)
int a = Convert.ToInt32(Math.Round((double)9/2));→4or5
④四捨五入
int a = Convert.ToInt32(Math.Round((double)9/2,MidpointRounding.AwayFromZero));→5
⑤銀行丸めと名前の由来