Поле таблицы состоит из 4 цифр после запятой, в то время как исходные данные состоят только из 2 цифр после запятой

#ms-access #vba

#ms-access #vba

Вопрос:

Я использовал Round(Paid,2) для присвоения Me.Amt . Результат должен быть округлен до двухзначной десятичной дроби. Но это не двухзначная десятичная дробь. Я использую приведенный ниже код для тестирования. Amt Поле — это Currency поле. Десятичные разряды устанавливаются автоматически. Me.Amt формат — валюта, а десятичные разряды — автоматически.

Результат должен быть 47340.14 . Но это есть 47340.1484 как в Me.Amt , так и в записи таблицы.

     Dim lng As Long
    lng = 4734015
    Me.Amt = 0
    Me.Amt = CSng(l / 100)
  

Помощь очень ценится.

Комментарии:

1. Замените Me.Amt на Currency переменную, после чего отобразится ошибка преобразования.

2. Если Amt это поле валюты, почему бы вам не использовать CCur ?

Ответ №1:

Проблема возникает из-за CSng преобразования результата в Single значение, имеющее точность около 7 десятичных цифр. Значение типа 47340.15 не может быть представлено конечным числом двоичных дробных цифр.

Просто удалите CSng .

Я провел тест с

 Private Sub Command2_Click()
    Dim lng As Long
    lng = 4734015
    Me.Amt = lng / 100
End Sub
  

и получил результат 47340.15 . Если вы разделите длинное значение на 100, нет смысла округлять результат до 2 цифр, поскольку в нем никогда не будет больше 2 цифр.

Но обратите внимание, что Access не поддерживает вычисления над Currency значениями. Если вы вычислите, CCur(lng) / CCur(100) результатом будет Double . Вы можете проверить это с помощью TypeName(CCur(lng) / CCur(100)) . Double удваивает точность по сравнению с Single .

Ответ №2:

Я меняю Payed с single на Currency, и результат теперь правильный. Спасибо.