• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Функция Round?

  • Автор темы alexstudent
  • Дата начала
A

alexstudent

Привет! Может кто сталкивался с этим! В скрипте произвожу вычисления и получается такое вот число 1,58999999999999E-03. Разумеется не читабельно! Нужно Оставить 2 или более знака после запятой. Использую функцию Round(). currentPr1 = Round(Cstr(currentPr1), 3). Результат таков что не отображается ноль перед запятой - ,002. Можно сделать так чтобы нормально число отображалось? Что использовать?
 
A

alexstudent

Нет! Тот же результат! без нуля!
 
G

Gor

ещё есть Format()

Format$ ( Ccur(значение), "0.000")
 
A

alexstudent

Спасибо! А вот слона то я и не заметил!!!
 
Z

ZhAN

Всем доброго времени суток!
Дабы не плодить новую тему, возник вопрос по поводу функции Round.

1. Берем любое число например 1,125
2. Делаем Msgbox Round(1.125, 2)
3. Получаем 1.12

После всех экспериментов выясняем что не работает округление 2 если следом 5 :
Round(1.25, 1)
Round(2.125, 2)

Это только у меня глюк или у всех она работает неправильно, и как кто с этим боролся?
 
R

RAJ

После всех экспериментов выясняем что не работает округление 2 если следом 5 :
Round(1.25, 1)
Round(2.125, 2)

Это только у меня глюк или у всех она работает неправильно, и как кто с этим боролся?

в хелпе приводится пример тоже с 5:
Print Round(4.45, 1) ' Prints 4.4

так что всё правильно :ya_lamo:
 
R

RAJ

а почему тогда Round(1.1251, 2) возвращает 1.13
и Print Round(4.451, 1) возвращает Prints 4.5

наверное, потому что приведя к 4-м значному числу после запятой имеем:
в первом случае имеем 1.1250
во втором случае - 1.1251
дополнительная единичка в конце перевешивает весы в сторону большего округления, как мне кажется
 
Z

ZhAN

приведя к 4-м зна
приведя к 4-м зна

просто непонятно из того же хелпа как получилось
Print Round(4.35, 1) ' Prints 4.4
и почему
Print Round(4.45, 1) ' Prints 4.4

это я с ума схожу или чего то не понимаю?
просто не было бы все так печально, было бы грустно, на больших числах при такой работе функции теряем денежки...
 
T

turumbay

просто непонятно из того же хелпа как получилось
Print Round(4.35, 1) ' Prints 4.4
и почему
Print Round(4.45, 1) ' Prints 4.4

это я с ума схожу или чего то не понимаю?
просто не было бы все так печально, было бы грустно, на больших числах при такой работе функции теряем денежки...
это т.н. "бухгалтерское округление". решает цифра перед пятеркой — если она четная, то округление вниз, иначе вверх - т.е. округляется к ближайшему четному.
подробности можно загуглить или почитать в хелпе:
If the first non-significant digit is 5, and all subsequent digits are 0, the last significant digit is rounded to the nearest even digit. See the example that follows.

P.S. Есть мнение, что использование чисел с плавающей точкой для финансовых вычислений, нужно приравнивать к преступлению...
 
R

RAJ

обратите внимание:
Код:
Print Round(4.05, 1)					' Prints 4
Print Round(4.15, 1)					' Prints 4.2
Print Round(4.25, 1)					' Prints 4.2
Print Round(4.35, 1)					' Prints 4.4
Print Round(4.45, 1)					' Prints 4.4
Print Round(4.55, 1)					' Prints 4.6

получается он увеличивает только нечетную цифру до чётной:
1 к 2
3 к 4
5 к 6

а чётные цифры не изменяет
 
Z

ZhAN

P.S. Есть мнение, что использование чисел с плавающей точкой для финансовых вычислений, нужно приравнивать к преступлению...
Я только за ! :)
Но вот для клиента страховой при расчете тарифа это совсем не есть гуд!
 
T

turumbay

Я только за ! :)
Но вот для клиента страховой при расчете тарифа это совсем не есть гуд!
При выполнении таких расчетов нужно помнить как минимум 2 факта:
1. для финансовых вычислений придуман специальный тип данных. ( Currency в LS, BigDecimal в java и т.п.)
2. функция LS round() выполняет не математическое, а бухгалтерское округление, о чем и написано в хелпе.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
берите LS2J и округляйте математически ;)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 784
157
BIT
57
lmike, может WinAPI ещё прикрутим? Или МатЛаб? ;)

Visual Basic:
%REM
    Function RoundUp5
    Description: математическое округление - к ближайшему числу, кратному 10
%END REM
Function Round5(numExpr, Byval nDecPlaces As Integer)
    Dim corr As Integer
    If Fraction(numExpr) = 0 Then
        corr = 100
        nDecPlaces = 1
    Else
        corr = 1
    End If
    Round5 = (Fix(numExpr / corr * 10 ^ nDecPlaces + .5) / 10 ^ nDecPlaces) * corr
End Function

Visual Basic:
%REM
    Function RoundUp5
    Description: округление к ближайшему числу, кратному 5
%END REM
Function RoundUp5(n As Integer)
    RoundUp5 = Round5(n / 5, 0) * 5
End Function
 
Последнее редактирование:
Z

ZhAN

извращаться можно бесконечно долго, и прикрутить что угодно :) , главное ответить на вопрос: - А надо ли? И кто это оценит ? :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
214
просто не было бы все так печально, было бы грустно, на больших числах при такой работе функции теряем денежки...
это не доказанное утверждение
статистика распределения цифр с вероятностями округления у вас отсутствует
деньги можно и выиграть (таким образом)
а вот для быдлобухгалтеров использование хехеля даёт "едиственно верный" результат :)
а ваще turumbay правильно заметил https://codeby.net/threads/32200.html?vi...st&p=205339
и никакие доводы
Но вот для клиента страховой при расчете тарифа это совсем не есть гуд!
не являются ни оправданием ни мотивом для действий

если человек учился в институте (техническом - точно) то там "проходили" такое понятие как и ...

Добавлено:
А надо ли? И кто это оценит ? :)
из вышеизложенного делайте выводы сами ;)
 
Z

ZhAN

это не доказанное утверждение

Спорить не собираюсь ни с кем, вот один из примеров

Вы получили договор страхования на руки где застраховали что то, страховая сума составила 100 000
Вам рассчитали тариф 7,70

Страховой платеж который составил (100 000*7,70)/100=7700

Вы как клиент хотите этот платеж разбить на 4 части, а СК должна отобразить тариф периода и суму периода
Итого тариф периода 7,7/4 =1,925 округляем получаем 1,92

Клиенту выдается распечатка:
1 период тариф 1,92 сума 1920
2 период тариф 1,92 сума 1920
3 период тариф 1,92 сума 1920
4 период тариф 1,92 сума 1920

в итоге сума 7680
20 денежек в минусе
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!