Как к раунду в доступе MS, VBA

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
12
задан Curtis Inderwiesche 29 May 2014 в 16:26
поделиться

9 ответов

Будьте осторожны, VBA, Круглая функция использует округление банкира, где это округляется.5 к четному числу, как так:

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

принимая во внимание, что Excel Worksheet Function Round, всегда округляет в большую сторону.5.

я сделал некоторые тесты, и похоже, что.5 округлений (симметричное округление) также используются форматированием ячейки, и также для Ширины столбца, округляющейся (при использовании Общего Числового формата). Флаг 'Precision as displayed', кажется, не делает округления себя, это просто использует округленный результат формата ячеек.

я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но нашел, что Фиксируют, имеет ошибку, когда Вы пытаетесь дать ему число как 58,55; функция, дающая результат 58,5 вместо 58,6. Я тогда наконец обнаружил, что можно использовать функцию Excel Worksheet Round, как так:

Приложение. Вокруг (58.55, 1)

Это позволит Вам делать нормальное округление в VBA, хотя это не может быть столь же быстро как некоторая пользовательская функция. Я понимаю, что это совершило полный оборот от вопроса, но хотело включать его для полноты.

25
ответ дан 2 December 2019 в 03:19
поделиться

Копье, уже упомянутое наследовать округление bug в реализации VBA. Таким образом, мне нужна реальная функция округления в приложении VB6. Вот тот, который я использую. Это основано на том, который я нашел в сети, как обозначается в комментариях.

' -----------------------------------------------------------------------------
' RoundPenny
'
' Description:
'    rounds currency amount to nearest penny
'
' Arguments:
'    strCurrency        - string representation of currency value
'
' Dependencies:
'
' Notes:
' based on RoundNear found here:
' http://advisor.com/doc/08884
'
' History:
' 04/14/2005 - WSR : created
'
Function RoundPenny(ByVal strCurrency As String) As Currency

         Dim mnyDollars    As Variant
         Dim decCents      As Variant
         Dim decRight      As Variant
         Dim lngDecPos     As Long

1        On Error GoTo RoundPenny_Error

         ' find decimal point
2        lngDecPos = InStr(1, strCurrency, ".")

         ' if there is a decimal point
3        If lngDecPos > 0 Then

            ' take everything before decimal as dollars
4           mnyDollars = CCur(Mid(strCurrency, 1, lngDecPos - 1))

            ' get amount after decimal point and multiply by 100 so cents is before decimal point
5           decRight = CDec(CDec(Mid(strCurrency, lngDecPos)) / 0.01)

            ' get cents by getting integer portion
6           decCents = Int(decRight)

            ' get leftover
7           decRight = CDec(decRight - decCents)

            ' if leftover is equal to or above round threshold
8           If decRight >= 0.5 Then

9              RoundPenny = mnyDollars + ((decCents + 1) * 0.01)

            ' if leftover is less than round threshold
10          Else

11             RoundPenny = mnyDollars + (decCents * 0.01)

12          End If

         ' if there is no decimal point
13       Else

            ' return it
14          RoundPenny = CCur(strCurrency)

15       End If

16       Exit Function

RoundPenny_Error:

17       Select Case Err.Number

            Case 6

18             Err.Raise vbObjectError + 334, c_strComponent & ".RoundPenny", "Number '" & strCurrency & "' is too big to represent as a currency value."

19          Case Else

20             DisplayError c_strComponent, "RoundPenny"

21       End Select

End Function
' ----------------------------------------------------------------------------- 
1
ответ дан 2 December 2019 в 03:19
поделиться

Если Вы говорите об округлении к целочисленному значению (и не округление к n десятичные разряды), всегда существует старый школьный путь:

return int(var + 0.5)

(Можно сделать эту работу для n десятичные разряды также, но это начинает становиться немного грязным)

1
ответ дан 2 December 2019 в 03:19
поделиться
VBA.Round(1.23342, 2) // will return 1.23
0
ответ дан 2 December 2019 в 03:19
поделиться
1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000

и так далее. Вы будете часто находить, что по-видимому топорные решения как это намного быстрее, чем использование функций Excel, потому что VBA, кажется, работает в другом пространстве памяти.

, например, If A > B Then MaxAB = A Else MaxAB = B приблизительно 40 x быстрее, чем использование ExcelWorksheetFunction. Max

2
ответ дан 2 December 2019 в 03:19
поделиться

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

Интервал всегда округляет в меньшую сторону - Интервал (3.5) = 3, Интервал (-3.5) =-4

всегда Фиксирует раунды по направлению к нулю - Фиксируют (3.5) = 3, Фиксируют (-3.5) =-3

существуют также функции приведения, в особенности CInt и CLng, которые пытаются принудить число к целому типу или длинному типу (целые числа между-32 768 и 32,767, longs, между - 2,147,483,648 и 2,147,483,647). Они будут оба раунда к ближайшему целому числу, округляясь далеко от нуля от.5 - CInt (3.5) = 4, Cint (3.49) = 3, CInt (-3.5) =-4, и т.д.

2
ответ дан 2 December 2019 в 03:19
поделиться

В Швейцарии и в макрочастице в страховой индустрии, мы должны использовать несколько округляющихся правил, завися, если она chash, преимущество и т.д.

я в настоящее время использую функцию

Function roundit(value As Double, precision As Double) As Double
    roundit = Int(value / precision + 0.5) * precision
End Function

, который, кажется, хорошо работает

4
ответ дан 2 December 2019 в 03:19
поделиться

Расшириться немного на принятом ответе:

"Круглая функция работает вокруг к даже, который отличается от раунда до большего".
- Microsoft

Формат всегда окружает.

  Debug.Print Round(19.955, 2)
  'Answer: 19.95

  Debug.Print Format(19.955, "#.00")
  'Answer: 19.96

ACC2000: погрешности округления, когда Вы используете числа с плавающей запятой: http://support.microsoft.com/kb/210423

ACC2000: как округлить в большую сторону число или вниз желаемым инкрементом: http://support.microsoft.com/kb/209996

Круглая функция: http://msdn2.microsoft.com/en-us/library/se6f2zfx.aspx

Как реализовать пользовательское округление процедур: http://support.microsoft.com/kb/196652

9
ответ дан 2 December 2019 в 03:19
поделиться

Вот простой способ всегда округлять до следующего целого числа в Access 2003:

BillWt = IIf([Weight]-Int([Weight])=0,[Weight],Int([Weight])+1)

Например:

  • [Вес] = 5.33 ; Int([Вес]) = 5 ; так 5.33-5 = 0.33 (<>0), ответ: BillWt = 5+1 = 6.
  • [Вес] = 6.000, Int([Вес]) = 6 , так что 6.000-6 = 0, так что ответ: BillWt = 6.
0
ответ дан 2 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: