2011-10-07 4 views
8

私はCIntの問題を遭遇し、doubleを整数に変換しました。CIntは一貫してDouble値を丸めません - 小数点以下の部分を削除するにはどうすればよいですか?

問題は以下の通りです:

CInt(10.5) 'Result is 10 
CInt(10.51) 'Result it 11, but I expected 10... 

私はInteger.Parse vs CIntについての質問で指摘(int) 10.51は10

ようで、結果はちょうどいくつかの方法で丸みを帯びているC#スタイルの変換に慣れ。

しかし、私が必要とするのは、整数部分だけを取得し、分数部分を捨てることだけです。どのようにVB.NETでこの種の変換を行うことができますか?いくつかの研究の後、私はFix()関数を使ってトリックを行うことができることを知っていますが、それが最良の選択ですか?

+2

悪い:部分も0.50000000の丸めされる整数がダウンしている場合CINT(10.5)= 10が、CINT(11.5)= 12は、奇数のためにそれがアップ! – Martin

答えて

8

を助けCInt(Math.Floor(10.51)) 希望を試すことができると思います。

no = Convert.ToInt32(Int(10.51)) 
+0

私はこの方法が最初のものより良いのが好きです。ありがとう、AVD! – nbulba

+2

2つの答えを組み合わせると、私は 'CInt(Int(10。51)) 'はうまくいくはずです;) –

1

私はあなたが、これはあなたがIntまたはFix機能を使用することができますが、option strictonであれば整数に変換する必要がありますので、これらの関数の戻り値の型がdoubleである

+4

負の数の場合、期待される結果が得られないことに注意してください。 'Math.Floor(-10.51)'は '-11'です。あなたが '-10'を望むなら、' Math.Truncate'を使うことができます。 –

4

まず、CIntは、C#で(int)と等価であることを、あなたの仮定が間違っています。

第二に、CIntの丸め動作がランダムに割り当てられていない - それは実際に「銀行家が丸め」を使用:

小数部を。非整数値を整数型 型に変換すると、整数変換関数(CByte、CInt、CLng、CSByte、 CShort、CUInt、CULng、およびCUShort)によって小数部分が削除され、最も近い整数に値を丸めます。

小数部が正確に0.5の場合、整数変換 は、最も近い偶数の整数に丸めます。たとえば、0.5 が0に丸められ、1.5と2.5が2に丸められます。これは、 銀行員の丸めと呼ばれることがあります。その目的は、このような数値を多く追加すると が累積する可能性のあるバイアスを補うことです。

C#で(int)を使用する最良の当量はゼロ(Math.Truncateと同じ)に向かって丸めVisualBasic名前空間内Fix関数です。

これはDouble値を返しますので、CIntを使用してさらに整数に変換する必要があります。

CInt(Fix(10.5)) '10 
CInt(Fix(10.51)) '10 
CInt(Fix(11.5)) '11 
CInt(Fix(-10.5)) '-10 
CInt(Fix(-10.51)) '-10 
CInt(Fix(-11.5)) '-11 
関連する問題