CInt не округляет значение Double последовательно - как я могу удалить дробную часть? - PullRequest
9 голосов
/ 07 октября 2011

Я наткнулся на проблему с CInt и преобразованием двойного числа в целое число.

Проблема заключается в следующем:

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

Я привыкв преобразование в стиль C #, где (int) 10.51 равно 10.

Как указано в вопросе о Integer.Parse vs CInt , результат просто каким-то образом округляется.

Однако все, что мне нужно, это получить только целую часть и отбросить дробную.Как я могу добиться такого типа конвертации в VB.NET?После некоторых исследований я вижу, что я могу использовать функцию Fix(), чтобы сделать трюк, но разве это лучший выбор?

Ответы [ 3 ]

8 голосов
/ 07 октября 2011

Вы можете использовать функции Int или Fix, но тип возвращаемого значения этих функций является двойным, поэтому вы должны преобразовать его в Integer, если option strict равно on.

  no = Convert.ToInt32(Int(10.51))
5 голосов
/ 25 августа 2015

Во-первых, ваше предположение, что CInt эквивалентно (int) в C #, неверно.

Во-вторых, поведение округления CInt не назначается случайным образом - оно фактически использует «округление банкиров»:

Дробные части. При преобразовании нецелого значения в целое тип, целочисленные функции преобразования (CByte, CInt, CLng, CSByte, CShort, CUInt, CULng и CUShort) удалить дробную часть и округлить значение до ближайшего целого числа.

Если дробная часть равна точно 0,5, целочисленное преобразование округляет его до ближайшего четного целого числа . Например, 0,5 округляет до 0, а 1,5 и 2,5 оба округляют до 2. Это иногда называют округление банкира, и его цель состоит в том, чтобы компенсировать может накапливаться при сложении многих таких чисел.

Наилучшим эквивалентом использования (int) в C # является функция Fix в пространстве имен VisualBasic, которая округляется до нуля (аналогично Math.Truncate).

Это, однако, возвращает значение 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
1 голос
/ 07 октября 2011

Я думаю, вы можете попробовать CInt(Math.Floor(10.51)) надеюсь, что это поможет

...