Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: А помогите с деньгами
 
 автор: час   (13.01.2010 в 16:43)   личное сообщение
 
 

Складываю в программе 125.26+1.75
получаю почему та 127,0136
Всё бы ни чего, но окончательный результат 127,14
=====================================
Вобщем функция округления - работает не верно
она 0136 превращает в 14
потому как val (013) = 13 и плюс 1 = 14

  Ответить  
 
 автор: osmor   (13.01.2010 в 17:07)   личное сообщение
 
 

ты уверен что складываешь именно 125.26+1.75
скорее всего это у тебя отображается 125.26+1.75 а на самом деле 125.2587 + 1.7549
Пока отвечал... вопрос уже поправили...

какай функция округления ?

  Ответить  
 
 автор: час   (13.01.2010 в 17:13)   личное сообщение
 
 

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

  Ответить  
 
 автор: час   (13.01.2010 в 17:22)   личное сообщение
 
 

потому как val ("01") = 1
У мну в функцию округления передаётся строка "0136"

и после округления получаем число = 14

  Ответить  
 
 автор: Анатолий (Киев)   (13.01.2010 в 20:14)   личное сообщение
 
 

Потому, что Dim X1 As Long Сделайте Currency

  Ответить  
 
 автор: час   (13.01.2010 в 20:41)   личное сообщение
 
 

Извините делал - эфекта нет
потому как 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


  Ответить  
 
 автор: Explorer   (13.01.2010 в 21:16)   личное сообщение
 
 

а родная access-ная функция Round не подошла?

  Ответить  
 
 автор: alecks_lp   (13.01.2010 в 21:18)   личное сообщение
 
 

А так?

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

  Ответить  
 
 автор: час   (13.01.2010 в 21:45)   личное сообщение
 
 

круто - попробую!!!!!!!
========================
НЕТ не попробую у мну передаваемый в функцию агрумент - оно стрингового типа значение.(трусики такие - стринги).
А в Вашем предложении - это денежки.......
x - число для округления

  Ответить  
 
 автор: Explorer   (13.01.2010 в 21:33)   личное сообщение
 
 

http://www.integritywindows.com/?page=Skills2010#_games

  Ответить  
 
 автор: час   (13.01.2010 в 21:44)   личное сообщение
 
 

родная access - строки не хочет округлять
А если преобразовать - нолик пропадать

  Ответить  
 
 автор: Explorer   (13.01.2010 в 21:55)   личное сообщение
 
 


строки не хочет округлять



это понятно - но почему строки?

  Ответить  
 
 автор: час   (13.01.2010 в 22:01)   личное сообщение
38 Кб.
 
 

Ну потому, что 126,0136 это строка
юзер может запятую ввести, может точку ввести - ему юзеру пох...вала

Мы из неё делаем "126" & "." & "0136"
затем надо округлить "0136" до двух знаков
и спаять "126" & "." & "01"
==============================
за ссылочку особое мерси

  Ответить  
 
 автор: Explorer   (13.01.2010 в 22:40)   личное сообщение
 
 


юзер может запятую ввести, может точку ввести - ему юзеру пох...вала



что-то ты не то затеял ИМХО получается что хранишь в базе мусор а не данные. лучше приводи к числу в момент ввода данных пользователем.

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

про разные округления много есть написано на этом форуме - поройся

  Ответить  
 
 автор: час   (13.01.2010 в 21:47)   личное сообщение
 
 

Это не помогло

http://www.integritywindows.com/?page=Skills2010#_games

  Ответить  
 
 автор: alecks_lp   (14.01.2010 в 08:47)   личное сообщение
 
 


НЕТ не попробую у мну передаваемый в функцию агрумент - оно стрингового типа значение.(трусики такие - стринги).


А какие проблемы
?
Сделайте функцию as Variant
Добавьте обработчик типов данных
Пользуйтесь на все случаи

  Ответить  
 
 автор: час   (14.01.2010 в 08:53)   личное сообщение
 
 

Спасибо!!!

  Ответить  
 
 автор: Canek   (19.01.2010 в 14:42)   личное сообщение
 
 

Не знаю решили ли Вы свою задачу, но на всякий случай опишу как бы сделал по Вашим требованиям.

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

Т.е. число на входе 0136
Запоминаем, что один ноль и округляем число 136.
В результате получаем 14 и наш ноль, тем самым результатом будет 014.

Если нужна будет помощь в написании такого кода пишите!
Надеюсь чем-нибудь помог.

  Ответить  
 
 автор: час   (19.01.2010 в 17:50)   личное сообщение
 
 

Спасибо,
но результат должен быть 01 - это копейки и должно быть два знака
если 0000156 - тада результат 00
====================================
дык вобщем то решение вон там наверху лежит......

  Ответить  
 
 автор: V.Kim   (20.01.2010 в 13:06)   личное сообщение
 
 

В канве вопроса, думаю можно округлять так:


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

  Ответить  
 
 автор: час   (20.01.2010 в 13:44)   личное сообщение
 
 

Спасибо Ким, - красиво......

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList