web-dev-qa-db-ja.com

C#での値の切り上げまたは切り捨て

ゲームの終了時にスコアを与えるゲームを作成しましたが、問題はこのスコアが小数点以下の桁数が多い数値(87.124563563566など)である場合があることです。 87.12のように値を切り上げたり切り下げたりするにはどうすればよいですか?

ありがとう!

33
c11ada

Math.Round を使用してみてください。さまざまなオーバーロードにより、必要な桁数を指定したり、数字を丸める方法を指定したりできます。

37
Zach Johnson

常に切り上げまたは切り捨てを行うには、Math.Ceiling(87.124563563566)またはMath.Floor(87.124563563566)を使用します。これは最も近い整数になると思います。

93
Jim

常に小数点以下2桁に切り捨てるには:

decimal score = 87.126;
Math.Floor(score * 100) / 100; // 87.12

常に小数点以下2桁まで切り上げるには:

decimal score = 87.124;
Math.Ceiling(score * 100) / 100; // 87.13
11
Serj Sagan

スコアを破壊するのではなく、文字列をフォーマットするだけです。

7
Timurid
double test2 = 87.2345524523452;
double test3 = Math.Round(test2, 2);
5
Charles Gargent

doubleタイプの変数には問題なく、数学的に正しい数値です。
このような状況を回避するための解決策を2つ確立しています。

  1. string solution:ユーザーに番号を表示するときは、それを行うだけです:variable.ToString( "0.00")。 ToStringは数字を切り取っています。
  2. 丸めソリューション:丸めを制御する場合は、Mathライブラリを使用できます。

この「奇妙な」数字が表示される理由を知りたいのですが、ここで読むことができます: 無理数

4
Avram

コメントを追加するほどの評判がないので、答えを作成する必要があります。しかし、timuridは正しい、文字列をフォーマットするだけです。

あなたが探しているものは次のとおりだと思います:

var myScore = 87.124563563566
var toShowOnScreen = myScore.ToString("0.00");

値をフォーマットするカスタムの方法のいくつかをここで説明します: https://msdn.Microsoft.com/en-US/library/7x5bacwt(v = vs.80).aspx

1
Kabwla-TwoLips

多くの人は、数学ライブラリを使用して数値を丸めることを推奨していますが、それでも非常に小さな丸め誤差が生じる可能性があります。 Math.Roundは、末尾にゼロが付いた数値と非常に小さな丸め誤差を持つ数値を返すことができます。これは、内部的にはfloatとdoubleがまだ2進数として表されているため、特定の小さな10進数をきれいに表すことが難しい場合が多いためです。

最適なオプションは、文字列フォーマットのみを使用するか、実際に丸めたい場合は、2つを組み合わせることです。

Math.Round(val, 2).ToString("0.00")
0
Psymunn