|
|
|
|
| ты уверен что складываешь именно 125.26+1.75
скорее всего это у тебя отображается 125.26+1.75 а на самом деле 125.2587 + 1.7549
Пока отвечал... вопрос уже поправили...
какай функция округления ? | |
|
| |
|
|
|
| Public Function RoundTwo_(S As Variant) As Currency
'Округлят аргумент до двух знаков
Dim X As String
Dim X1 As Long
Dim F As Long
On Error GoTo RoundTwo__Error
'-------------------------------------------------------------------------------
On Error GoTo RoundTwoErr
X = S
For F = Len(X) To 2 Step -1 ' Если длинна уже 2 знака -выходим из функции
If Len(X) = 2 Then
RoundTwo_ = X1
Exit Function
End If
If Right(X, 1) >= 5 Then ' Если последняя цифра >= 5 тогда
X = Left(X, (F - 1))
X1 = Val(X) + 1 ' Если последняя цифра >= 5 тогда +1
X = X1
Else
X = Left(X, (F - 1))
X1 = Val(X)
End If
Next F
RoundTwo_ = X1
Exit Function
RoundTwoErr: 'Метка обработчика ошибок
RoundTwo_ = 0
Err.Clear
'-------------------------------------------------------------------------------
On Error GoTo 0
Exit Function
RoundTwo__Error:
Call Zapis_ERR("Funkcii_MOD" & "процедура->" & "RoundTwo_", Err.Number, Err.Description)
End Function | |
|
| |
|
|
|
| потому как val ("01") = 1
У мну в функцию округления передаётся строка "0136"
и после округления получаем число = 14 | |
|
| |
|
|
|
| Потому, что Dim X1 As Long Сделайте Currency | |
|
| |
|
|
|
| Извините делал - эфекта нет
потому как 01 - всегда после обработки функциями = 1
===============================================
поправил функцию
Public Function RoundTwo_(S As Variant) As String
'Округлят аргумент до двух знаков
Dim X As String
Dim F As Long
X = S
For F = Len(X) To 2 Step -1 ' Если длинна уже 2 знака -выходим из функции
If Len(X) = 2 Then
RoundTwo_ = X
Exit Function
End If
If Right(X, 1) >= 5 Then ' Если последняя цифра >= 5 тогда
X = Left(X, (F - 1))
X = Left(X, (Len(X) - 1)) & Val(Right(X, 1)) + 1 ' Если последняя цифра >= 5 тогда +1
'X = X1
Else
X = Left(X, (F - 1))
'X1 = Val(X)
End If
Next F
'X1 = Val(X)
RoundTwo_ = X
Exit Function
RoundTwoErr: 'Метка обработчика ошибок
RoundTwo_ = 0
Err.Clear
End Function
|
| |
|
| |
|
|
|
| а родная access-ная функция Round не подошла? | |
|
| |
|
|
|
| А так?
x - число для округления
D - количество знаков после округления
Public Function BRound(ByVal x As Currency, Optional ByVal D As Integer = 0) As Currency
Const DEC_SIMBOL = 10
Const ROU_LEVEL = 0.5
BRound = Fix(x * DEC_SIMBOL ^ D + ROU_LEVEL * Sgn(x)) / DEC_SIMBOL ^ D
End Function
|
| |
|
| |
|
|
|
| круто - попробую!!!!!!!
========================
НЕТ не попробую у мну передаваемый в функцию агрумент - оно стрингового типа значение.(трусики такие - стринги).
А в Вашем предложении - это денежки.......
x - число для округления | |
|
| |
|
|
|
| http://www.integritywindows.com/?page=Skills2010#_games | |
|
| |
|
|
|
| родная access - строки не хочет округлять
А если преобразовать - нолик пропадать | |
|
| |
|
|
|
|
строки не хочет округлять
|
это понятно - но почему строки? | |
|
| |
|
38 Кб. |
|
| Ну потому, что 126,0136 это строка
юзер может запятую ввести, может точку ввести - ему юзеру пох...вала
Мы из неё делаем "126" & "." & "0136"
затем надо округлить "0136" до двух знаков
и спаять "126" & "." & "01"
==============================
за ссылочку особое мерси | |
|
| |
|
|
|
|
юзер может запятую ввести, может точку ввести - ему юзеру пох...вала
|
что-то ты не то затеял ИМХО получается что хранишь в базе мусор а не данные. лучше приводи к числу в момент ввода данных пользователем.
такие изыски как "число заведено строкой" могут быть нужны только при импорте данных из разношерстых внешних источников, да и то только для приведения к числу.
про разные округления много есть написано на этом форуме - поройся | |
|
| |
|
|
|
| Это не помогло
http://www.integritywindows.com/?page=Skills2010#_games | |
|
| |
|
|
|
|
НЕТ не попробую у мну передаваемый в функцию агрумент - оно стрингового типа значение.(трусики такие - стринги).
|
А какие проблемы
?
Сделайте функцию as Variant
Добавьте обработчик типов данных
Пользуйтесь на все случаи | |
|
| |
|
|
|
|
| Не знаю решили ли Вы свою задачу, но на всякий случай опишу как бы сделал по Вашим требованиям.
Так как у Вас передаваемое число как текст, то необходимо посчитать кол-во нулей до определенного разряда (если требуется хранить определенное кол-во разрядов) или до первой цифры не равной нулю, а затем их отбросить и округлить оставшееся число и прибавить нулю перед результатом. Я бы сделал так.
Т.е. число на входе 0136
Запоминаем, что один ноль и округляем число 136.
В результате получаем 14 и наш ноль, тем самым результатом будет 014.
Если нужна будет помощь в написании такого кода пишите!
Надеюсь чем-нибудь помог. | |
|
| |
|
|
|
| Спасибо,
но результат должен быть 01 - это копейки и должно быть два знака
если 0000156 - тада результат 00
====================================
дык вобщем то решение вон там наверху лежит...... | |
|
| |
|
|
|
| В канве вопроса, думаю можно округлять так:
Public Function RoundTwo_(ByVal S As Variant) As Currency
'Округлят аргумент до двух знаков
On Error GoTo RoundTwo__Error
RoundTwo_ = Round(CCur(Replace(S, ".", ",")), 2)
Exit Function
RoundTwo__Error:
'Call Zapis_ERR("Funkcii_MOD" & "процедура->" & "RoundTwo_", Err.Number, Err.Description)
End Function
|
| |
|
| |
|
|
|
| Спасибо Ким, - красиво...... | |
|
| |