doubleを最も近い整数値に変換するにはどうすればよいですか?


147

doubleを最も近いintに変換するにはどうすればよいですか?

回答:


78

使用する Math.round()と組み合わせてするMidpointRounding.AwayFromZero

例えば:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

6
Convert.ToInt32()同じことをしませんか、それとも小数点以下をすべて取り除きますか?
マフィンマン

208
実際には整数を生成しませんが、倍精度を生成します。
gatopeich

13
@ロニー-いいえ、それは設計によるものです。デフォルトでは、Math.Roundは点数(x + .5)を最も近い偶数に丸めます。別の動作が必要な場合は、フラグを使用して指定する必要があります。msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf

6
まあ私は絶対にありません!:)
ロニー

5
DoubleはIntではありません。
Evgeni Nabokov

267
double d = 1.234;
int i = Convert.ToInt32(d);

参照

次のように丸めを処理します。

最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合は、偶数が返されます。つまり、4.5は4に変換され、5.5は6に変換されます。


7
Math.Round必要に応じてintを返すため、はるかに優れています。
キース

10
@ robert-koritnik。それが「無効」である理由がわかりません。OPは優先丸め規則を指定していません。「0.5から最も近い偶数への丸め」が標準的な規則です。常に切り上げを行うと、不要な統計的影響が生じます。
キース

@キース:わかりませんが、私は常にx.5を切り上げるように教えられてきましたが、統計のためにそれを増減する理由を見ることができます。それをありがとう。PSこのような丸めがデフォルトであると思われる統計、財務、または会計に私が参加していないことは明らかです
Robert Koritnik

3
「常に切り上げは望ましくない統計的影響を与える」-それは単なる誤りです。.5を四捨五入[0,.5)すると、数値のちょうど半分が丸め[.5,1)られます。それは丸めて少しでも、偶数にバイアスをかけるために丸め(.5,1.5)1ではなく[1.5,2.5]2に
ジム・Balter

11
@JimBalterゼロは丸められないため、半分に丸めると正のバイアスが発生するため、非対称丸めと呼ばれます。分布が十分であり、丸めが偶数または不均一な数値のどちらにもバイアスをかけない場合、「半分から偶数に丸める」は行われません。半ば丸めのタイブレークを参照してください。
sdds 2014

36

関数を使用することもできます:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

アーキテクチャによっては数倍高速です。


Math.Roundが思い通りに機能していなかったので、これは私にとって完璧でした。
Hanna、

@cullubはい、あります。0.5が追加されたdouble dを整数に変換します。
ダレル

これは私の好みの方法です-非常に単純な方法で動作します。Math.Round(d、MidpointRounding.AwayFromZero)よりもはるかに短く読みやすく、ifステートメントを使用して切り捨てまたは切り上げを選択するよりも簡潔です。そして、実際には、ダブルではなく整数を最後に返します
バインダーバインドされた

3
負の数(MyRound(-1.2)= 0)での奇妙な動作については、以下の@ Eternal21のコメントを参照してください
Chris

2
疑問に思う方のために、@ Chrisによって言及された問題は、現在、値が負であるかどうかをチェックすることによっておそらく解決されています。
John Weisz

14
double d;
int rounded = (int)Math.Round(d);

5

私はこの質問が古いことを知っていますが、同じような質問への答えを探すためにそれを見つけました。与えられた非常に役立つヒントを共有したいと思いました。

intに変換する場合は、.5ダウンキャストする前に値を追加するだけです。ダウンキャスティングはint常に低い数値(例:)に低下するため、(int)1.7 == 1数値が.5大きいか大きい場合、追加.5すると次の数値になり、ダウンキャストintによって正しい値が返されます。(例(int)(1.8 + .5) == 2


13
問題は、負の値をそのように変換しようとする場合です。たとえば、-1.25は最終的に0に等しくなります(-1.25 + 0.5 = 0.75、一度キャストすると0になります)。したがって、負の値から0.5を引く必要があります。
Eternal21 2014年

使用できます+ 0.5 * Math.Abs(d)
TaW


-1

Unityの場合は、Mathf.RoundToIntを使用します

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

ソース

public static int RoundToInt(float f) { return (int)Math.Round(f); }

QはUnityについて言及もタグ付けもしていません。
XenoRo

@XenoRo Unityを使用しているときに同様の答えを探している人のために、私はこの古い質問に答えていました。
zwcloud

2
知識を共有するための独自の質問に答えることができます。このような場合は、API(この場合はUnity)に固有の別の質問を作成します。回答は質問に適切である必要があります。それ以外の場合は、丸め関数を使用するすべてのC#APIの答えがここにあります。
XenoRo

-2

Intボタンを備えた関数電卓を開発しています。私は以下がシンプルで信頼できる解決策であることがわかりました:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Roundは予期しない結果または望ましくない結果を生成することがあり、(キャストまたはConvert.ToInt ...を介した)整数への明示的な変換は、高精度の数値に対して誤った値を生成することがよくあります。上記の方法は常に機能するようです。


2
これはすべての負の数を切り上げ、すべての正の数を切り捨てませんか?これは必ずしも「最も近い」整数ではありません。
Tim Pohlmann、2015

これは最も近い数ではありません。
Samer Aamar

1
1.99の場合、これは1.0を返します。
Jon Schneider
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.