Функция Round()?

alexstudent

Well-Known Member
13.09.2009
107
0
30
Саратов
#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
38
Украина, Днепр
#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
38
Украина, Днепр
#9
а почему тогда Round(1.1251, 2) возвращает 1.13
и Print Round(4.451, 1) возвращает Prints 4.5
наверное, потому что приведя к 4-м значному числу после запятой имеем:
в первом случае имеем 1.1250
во втором случае - 1.1251
дополнительная единичка в конце перевешивает весы в сторону большего округления, как мне кажется
 
Z

ZhAN

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

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

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

ZhAN

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

VladSh

начинающий
Lotus team
11.12.2009
1 248
2
Киев (Русь)
#17
lmike, может WinAPI ещё прикрутим? Или МатЛаб? ;)

Код:
Function Round5(Value, Fract As Integer)
Round5 = Fix(Value * 10^Fract + .5) / 10^Fract
End Function
прим.: Fract - количество знаков после запятой
 
Z

ZhAN

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

lmike

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

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

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

ZhAN

Гость
#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 денежек в минусе