Округление числа в меньшую сторону в Visual Basic

У меня есть приложение Visual Basic, которому необходимо округлить число в меньшую сторону, например, 2,556 станет 2,55, а не 2,26.

Я могу сделать это, используя функцию для удаления символов более 2 прямо из десятичной точки, используя это:

Dim TheString As String
TheString = 2.556
Dim thelength = Len(TheString)
Dim thedecimal = InStr(TheString, ".", CompareMethod.Text)
Dim Characters = thelength - (thelength - thedecimal - 2)
_2DPRoundedDown = Left(TheString, Characters)

Есть ли лучшая функция для этого?


person Paul    schedule 04.08.2009    source источник


Ответы (5)


Это можно сделать с помощью Math.Floor. Однако вам нужно будет умножить * 100 и разделить, так как вы не можете указать количество цифр.

Dim theNumber as Double
theNumber = 2.556
Dim theRounded = Math.Sign(theNumber) * Math.Floor(Math.Abs(theNumber) * 100) / 100.0
person Reed Copsey    schedule 04.08.2009
comment
Иногда полезно хранить ваши числа как целые числа или числа с фиксированной запятой (если вам не нужен полный диапазон чисел с плавающей запятой), выполнять вычисления над числами с фиксированной запятой, а затем корректировать их при отображении пользователю. - person David Smith; 04.08.2009
comment
@Justin: Хороший вопрос - я отредактировал, чтобы учесть отрицательные числа, а также положительные - person Reed Copsey; 04.08.2009
comment
Поскольку это VB, просто используйте тип данных Currency. - person Robert L; 05.09.2009

Другой способ сделать это, который не зависит от использования типа String:

Dim numberToRound As Decimal
Dim truncatedResult As Decimal
numberToRound = 2.556
truncatedResult = (Fix(numberToRound*100))/100
person Saul Dolgin    schedule 04.08.2009
comment
Использование Fix() будет немного быстрее, чем использование Floor(). - person Justin; 04.08.2009
comment
Есть ли у вас что-нибудь, что поддерживает это утверждение? - person Reed Copsey; 04.08.2009
comment
@Justin: Fix на самом деле медленнее, чем Math.Floor - он выполняет проверку, а затем вызывает Math.Floor внутри. Запустите рефлектор на Microsoft.VisualBasic.dll для получения подробной информации. - person Reed Copsey; 04.08.2009
comment
Ой, я сказал это задом наперёд. Ваш комментарий был моим обоснованием. - person Justin; 04.08.2009

Ответ Math.Floor() хорош. Я не уверен, в какой именно среде VB определен Fix(). Как указывает Джастин, Math.Floor() не работает с отрицательными числами. Вам придется взять абсолютное значение, а затем умножить его на SGN() числа. Я не знаю точного имени функции, которую вы использовали бы для получения SiGN (не sin() ) числа.

В псевдокоде с учетом отрицательных значений результат будет выглядеть так:

result = sgn( num ) * floor( abs( num * RoundToDig ) ) / RoundToDig

-- Пушистые коровы мычат и разжимаются.

person WyrdestGeek    schedule 04.08.2009
comment
Я привык к функции Fix() из VB6, но она доступна и в VB.NET — msdn.microsoft.com/en-us/library/ - person Saul Dolgin; 04.08.2009
comment
@WyrdestGeek: это функция Math.Sign. @Saul: исправление внутренних вызовов Math.Floor. - person Reed Copsey; 04.08.2009
comment
Что это за декомпрессия крупного рогатого скота? - person Saul Dolgin; 04.08.2009

Чтобы округлить

Math.Floor(number)

Чтобы обрезать символы

number.Substring(0,1)

Вы можете преобразовать его в строку.

person ad48    schedule 06.06.2013

Dim Input As Decimal
Dim Output As Decimal
Input = 2.556
Output = Input - (Input Mod 0.01)

Это будет работать как с положительными, так и с отрицательными числами

person Oncure1    schedule 08.08.2016