2009-08-04 1 views
7

У меня есть приложение Visual Basic, которое должно округлять число вниз, например, 2.556 станет 2.55, а не 2.26.Округление числа в Visual Basic

я могу сделать это, используя функцию, чтобы сдирать символы более чем на 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) 

Есть ли лучшая функция, чтобы сделать это?

ответ

10

Вы можете сделать это с помощью Math.Floor. Тем не менее, вам нужно умножить * 100 и разделить, так как вы не можете поставить ряд цифр

Dim theNumber as Double 
theNumber = 2.556 
Dim theRounded = Math.Sign(theNumber) * Math.Floor(Math.Abs(theNumber) * 100)/100.0 
+0

Это не будет работать, если число отрицательное. – Justin

+0

Иногда полезно сохранять ваши числа целыми числами или фиксированной точкой (если вам не нужен полный диапазон с плавающей запятой), выполняя вычисления по номерам с фиксированной запятой, а затем настраивая их при отображении пользователю. –

+0

@ Justin: Хороший вопрос - я отредактировал для учета отрицательных чисел, а также положительный –

3

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

Dim numberToRound As Decimal 
Dim truncatedResult As Decimal 
numberToRound = 2.556 
truncatedResult = (Fix(numberToRound*100))/100 
+0

Использование Fix() будет немного быстрее, чем использование Floor(). – Justin

+2

Что вы поддерживаете это утверждение? –

+1

@Justin: Fix на самом деле медленнее, чем Math.Floor - он выполняет проверку, а затем вызывает Math.Floor внутри. Запустите рефлектор на Microsoft.VisualBasic.dll для получения дополнительной информации. –

2

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

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

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

- Пушистые коровы мычат и распаковывать.

+0

Я использую функцию Fix() из VB6, но она также доступна в VB.NET - http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.conversion.fix.aspx –

+0

@WyrdestGeek: функция Math.Sign. @Saul: Fix вызывает Math.Floor внутри. –

+0

Что это за декомпрессия быков? –

1

округлить

Math.Floor(number) 

Для обрезки символов

number.Substring(0,1) 

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

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

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