powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Округление данных в таблице
25 сообщений из 51, страница 2 из 3
Округление данных в таблице
    #32198184
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Саныч
>Виктор, если сделать 0.49, то весь интервал от 0.49 до 0.5 будет обрабатываться неправильно.

Почему же?
Все работает нормально. Ты алгоритм посмотри
varTemp = CDec(Number) * dblPower + 0.5 (0,49)
а потом Int(varTemp)

>Возьми как пример не 1.75, а 1.494.

Беру
? okrug(1.494,2)

При 0,49 - 1,49
При 0,499999 - 1,49
При 0,50 - 1,49
Все правильно.

Беру
? okrug(1.494,1)
При 0,49 - 1,5
При 0,499999 - 1,5
При 0,50 - 1,5
Все правильно.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198188
dave604
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТОЧНО!!!
Саныч - РЕСПЕКТ!
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198196
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Виктор, а если поставить в программе не 0.49, а 0.3 или 0.8? Может, оно вообще ни на что не влияет?
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198216
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>а если поставить в программе не 0.49, а 0.3 или 0.8? Может, оно вообще ни на что не влияет?

Оно нужно только как некое правило округления чисел, оканчивающихся на 5.
Кто считает что ему нужно вменьшую сторону - ставит ,049
Кто считает что ему нужно в большую - ставит - 0,5
Кто считает что ему надо по "правилам" - использут Round, правда тогда надо забыть о таком округлении Round (9999,-1)=10000

Вообще в том топике про округление проскаивала мысль сделать универсальную функцию, передавая в параметрах правило округления (или использовать глобальные натсройки программы). Это будет самый правильный подход. По-умолчанию сделать использование Round - и как самой быстрой и так самой "правильной". Но не забыть про консультироваться по правилам округления у бухгалтера - и лучше письмено.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198234
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Оно нужно только как некое правило округления чисел, оканчивающихся на 5.

Когда оно сидит в программе, оно не знает, для чего оно нужно. Там нет ифа "если кончается на 5". Через эту строку программы проходят все числа. Поэтому я и предлагаю проверить, как программа будет работать (с разными числами), если заменить 0.49 на другое число.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198637
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Поправлю сам себя (не по сути, а по примеру). Неправильно обрабатывается интервал от 0.5 до 0.51. Короче, надо попробовать взять эту функцию от 0.505, и сразу будет видно, что 0.49 - это баг.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198663
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я что-то сегодня туплю...

Где баг, Саныч
? okrug(0.505,1) при +0,49/+0,5 вернет 0,5 - что правильно.

0,505 - (0,50/0,51) - 0,5
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198686
Predator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здорово Я здесь прописался недавно.
Может я и опоздал со своими советами.

Простейший способ округлить до 2х знаков после запятой:
Результат = CCur(Format(Выражение, "0.00")) , но работает эта конструкция довольно медленно, вот пара вариантов побыстрее.


Public Function Okrug(s As Variant, Optional m As Byte = 2) As Double
'Округляет аргумент от 0 до m знаков после запятой
' при возникновении ошибки возвращает НОЛЬ
On Error GoTo OkrugErr
Dim n As Long, d As String
d = String(m, "0")
n = Val("1" & d)
If s * n - Int(s * n) < 0.5 Then
Okrug = Int(s * n) / n
Else
Okrug = (Int(s * n) + 1) / n
End If
Exit Function
OkrugErr: 'Метка обработчика ошибок
Okrug = 0
Err.Clear
End Function

а вот вариант округления только до ДВУХ знаков
- зато работает в трое быстрее

Public Function RoundTwo(s As Variant) As Currency
'Округлят аргумент до двух знаков после запятой
' при возникновении ошибки возвращает НОЛЬ
Dim x As Long
On Error GoTo RoundTwoErr
x = Int(s * 100)
If s * 100 - x < 0.5 Then
RoundTwo = CCur(x / 100)
Else
RoundTwo = CCur((x + 1) / 100)
End If
Exit Function
RoundTwoErr: 'Метка обработчика ошибок
RoundTwo = 0
Err.Clear
End Function
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198696
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Predator

Переименуйся в Plagiator. если конечно ты не Сергей Оркин.

http://msa.polarcom.ru/st/d_1000502.htm
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198704
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немерянная круть
Я всегда чуть не плачу когда вижу, как люди домножают что-то на степени 10 следующим образом.
Код: plaintext
1.
2.
d = String(m,  "0 ") 
n = Val( "1 " & d) 
... Int(s * n) ...


Круче этого только
Код: plaintext
... Val(CStr(s) &  "e"  & CStr(n)) ...

Честное слово, я это не сам придумал. В исходниках драйвера к кассовому аппарату видел
Код: plaintext
chislo = chislo &  "e-2 "

Видимо на 100 делили
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198721
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лоху
>chislo = chislo & "e-2"

Это ты нам уже постил :)

Ты по делу скажи - где в приведенной мной (02 июля 17:54) функции баг?
Саныч не откликается - выдохся :)
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198727
Predator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PlagiatorСТВОМ НЕКОГДА НЕ СТРОДАЛ
силочка
www.msaccess.ru
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198733
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну получай
Код: plaintext
1.
? okrug( 1 . 509 , 0 )
 1 

А должно быть 2

Саныч так и написал
Неправильно обрабатывается интервал от 0.5 до 0.51
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198734
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Predator

Ты не обижайся :)
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198763
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лоху
>? okrug(1.509,0)=1
>А должно быть 2

все - нашел -понял -спасибо тебе и Санычу.

Если использовать вместо 0,49 -> 0.499999999999999
то будет все нормально.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198778
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет

Код: plaintext
1.
? okrug( 1 .509e- 15 , 15 )
2e- 15 

А должно быть 1е-15

P.S. И не говори что я зануда.
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198787
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. наоборот
будет 1е-15, а должно быть 2е-15
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198818
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой хитрый :)

Тогда так (вместо 0,4999999)
varTemp = CDec(Number) * dblPower + CDec(0.5 - 1E-308)

:)
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198845
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаешь будет работать?
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198882
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет и для
? okrug(1.509e-28,28)
Но не больше/меньше 28 знаков
тогда делаем
varTemp = CDec(Number) * dblPower + CDec(0.5 - 1E-29)

Кстати. Round работает только до 22 знаков
? round(1.509e-22,22)

т.е. самопальная функция круче в 1 000 000 раз :)

З,Ы.

Во ху%ня получилась
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198888
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лоху спасибо за поддержку и за энергию, потраченную вместо меня. Я тебе должен много енотов. Слушай, меняй ник.

Виктору: я не выдохся, я сегодня в отпуске, а дома Интернет платный. :^)
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32198928
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а если сделать
varTemp = CDbl(Number) * dblPower + CDbl(0.5 - 1E-308)
то можно и с точностью до 308 знака :)
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32199244
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто возьмется это всё по округлению преобразоватьв FAQ?
уже 2 топика посвятили этому..
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32199712
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Только этот фак надо не в раздел "Аксесс", а в раздел "здравый смысл" или "математика за 1 класс".
...
Рейтинг: 0 / 0
Округление данных в таблице
    #32199730
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Саныч\r
\r
>а в раздел "здравый смысл" или "математика за 1 класс".\r
\r
Не знаю как у вас, у нас налоговый инспектор может и не знать о правилах округления и из-за расхождения в несколько копеек развернуть бухгалтера назад или штрафануть (им тоже план выполнять надо). В некоторых отчетах требуется "округлени" путем отбрасывания дробной части (1 руб 99к = 1 руб)\r
В главном топике это расписывалось. \r
Вывод можно сделать один: дать бухгалтеру самому определять правила округления. \r
======\r
"Умом Россию не понять..." (с) кто-то умный
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Округление данных в таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]