Функция Round()?

Тема в разделе "Lotus - Программирование", создана пользователем alexstudent, 5 окт 2009.

  1. alexstudent

    alexstudent Well-Known Member

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Cstr - имхо, лишнее

    currentPr1 = Round(currentPr1, 3)
     
  3. alexstudent

    alexstudent Well-Known Member

    Регистрация:
    13 сен 2009
    Сообщения:
    109
    Симпатии:
    0
    Нет! Тот же результат! без нуля!
     
  4. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    ещё есть Format()

    Format$ ( Ccur(значение), "0.000")
     
  5. alexstudent

    alexstudent Well-Known Member

    Регистрация:
    13 сен 2009
    Сообщения:
    109
    Симпатии:
    0
    Спасибо! А вот слона то я и не заметил!!!
     
  6. ZhAN

    ZhAN Гость

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

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

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

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

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    в хелпе приводится пример тоже с 5:
    так что всё правильно :ya_lamo:
     
  8. ZhAN

    ZhAN Гость

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

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    наверное, потому что приведя к 4-м значному числу после запятой имеем:
    в первом случае имеем 1.1250
    во втором случае - 1.1251
    дополнительная единичка в конце перевешивает весы в сторону большего округления, как мне кажется
     
  10. ZhAN

    ZhAN Гость

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

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    это т.н. "бухгалтерское округление". решает цифра перед пятеркой — если она четная, то округление вниз, иначе вверх - т.е. округляется к ближайшему четному.
    подробности можно загуглить или почитать в хелпе:
    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. Есть мнение, что использование чисел с плавающей точкой для финансовых вычислений, нужно приравнивать к преступлению...
     
  12. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    обратите внимание:
    Код (Text):
       
    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. ZhAN

    ZhAN Гость

    Я только за ! :)
    Но вот для клиента страховой при расчете тарифа это совсем не есть гуд!
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    При выполнении таких расчетов нужно помнить как минимум 2 факта:
    1. для финансовых вычислений придуман специальный тип данных. ( Currency в LS, BigDecimal в java и т.п.)
    2. функция LS round() выполняет не математическое, а бухгалтерское округление, о чем и написано в хелпе.
     
  15. ZhAN

    ZhAN Гость

    Всем спасибо за оперативность!
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    берите LS2J и округляйте математически ;)
     
  17. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    lmike, может WinAPI ещё прикрутим? Или МатЛаб? ;)

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

    ZhAN Гость

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это не доказанное утверждение
    статистика распределения цифр с вероятностями округления у вас отсутствует
    деньги можно и выиграть (таким образом)
    а вот для быдлобухгалтеров использование хехеля даёт "едиственно верный" результат :)
    а ваще turumbay правильно заметил http://codeby.net/forum/threads/32200.html?vi...st&p=205339
    и никакие доводы
    не являются ни оправданием ни мотивом для действий

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

    Добавлено:
    из вышеизложенного делайте выводы сами ;)
     
  20. ZhAN

    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 денежек в минусе
     
Загрузка...

Поделиться этой страницей