Функция Round()?

alexstudent

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

ZhAN

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

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

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

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

RAJ

Well-known member
17.01.2007
440
0
#7
После всех экспериментов выясняем что не работает округление 2 если следом 5 :
Round(1.25, 1)
Round(2.125, 2)

Это только у меня глюк или у всех она работает неправильно, и как кто с этим боролся?
в хелпе приводится пример тоже с 5:
Print Round(4.45, 1) ' Prints 4.4
так что всё правильно :ya_lamo:
 

RAJ

Well-known member
17.01.2007
440
0
#9
а почему тогда Round(1.1251, 2) возвращает 1.13
и Print Round(4.451, 1) возвращает Prints 4.5
наверное, потому что приведя к 4-м значному числу после запятой имеем:
в первом случае имеем 1.1250
во втором случае - 1.1251
дополнительная единичка в конце перевешивает весы в сторону большего округления, как мне кажется
 
Z
#10
просто непонятно из того же хелпа как получилось
Print Round(4.35, 1) ' Prints 4.4
и почему
Print Round(4.45, 1) ' Prints 4.4

это я с ума схожу или чего то не понимаю?
просто не было бы все так печально, было бы грустно, на больших числах при такой работе функции теряем денежки...
 
13.03.2009
625
1
#11
просто непонятно из того же хелпа как получилось
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. Есть мнение, что использование чисел с плавающей точкой для финансовых вычислений, нужно приравнивать к преступлению...
 

RAJ

Well-known member
17.01.2007
440
0
#12
обратите внимание:
Код:
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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#16
берите LS2J и округляйте математически ;)
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#17
lmike, может WinAPI ещё прикрутим? Или МатЛаб? ;)

Код:
Function Round5(Value, Fract As Integer)
Round5 = Fix(Value * 10^Fract + .5) / 10^Fract
End Function
прим.: Fract - количество знаков после запятой
 
Z
#18
извращаться можно бесконечно долго, и прикрутить что угодно :) , главное ответить на вопрос: - А надо ли? И кто это оценит ? :)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#19
просто не было бы все так печально, было бы грустно, на больших числах при такой работе функции теряем денежки...
это не доказанное утверждение
статистика распределения цифр с вероятностями округления у вас отсутствует
деньги можно и выиграть (таким образом)
а вот для быдлобухгалтеров использование хехеля даёт "едиственно верный" результат :)
а ваще turumbay правильно заметил http://codeby.net/forum/threads/32200.html?vi...st&p=205339
и никакие доводы
Но вот для клиента страховой при расчете тарифа это совсем не есть гуд!
не являются ни оправданием ни мотивом для действий

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

Добавлено:
А надо ли? И кто это оценит ? :)
из вышеизложенного делайте выводы сами ;)
 
Z
#20
это не доказанное утверждение
Спорить не собираюсь ни с кем, вот один из примеров

Вы получили договор страхования на руки где застраховали что то, страховая сума составила 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 денежек в минусе