#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, и результат теперь правильный. Спасибо.