8.х Математические вычисления и округления.

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем rSlayer, 17 ноя 2009.

  1. TopicStarter Overlay
    rSlayer
    Offline

    rSlayer Опытный в 1С

    Регистрация:
    31 мар 2009
    Сообщения:
    251
    Симпатии:
    0
    Баллы:
    26
    Добрый день. Столкнулись с такой проблемой. В БиС имеется списание бензина партиями. И получилась такая ситуация:
    При вычислении суммы списания имеется такая строка кода-
    СтрокаТаблицы.Сумма = ?(СтрокаТаблицы.Количество = КоличествоОстаток, мСтрок[0].СуммаОстаток, мСтрок[0].СуммаОстаток * (СтрокаТаблицы.Количество/КоличествоОстаток));

    Пример:
    Имеем поступление 140 литров на общую сумму 3 290 руб.
    Списываем 115,270.

    Сумма = 3290 * (115,27 / 140)
    По идее должно получиться 2 708,845, но
    1С вычисляет - 2 708,84499999999999999999999999999999953

    Соответственно потом идет округление 2 708,44...
    и пошло рвать на копейку.

    Помогите понять, это косяк платформы?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Конфигурация какая?
    Скорее всего, у вас реквизит Число(15,2) - в этом случае округления нет - лишние знаки просто отрезаются. Необходимо принудительно округлять в этом случае

  3. TopicStarter Overlay
    rSlayer
    Offline

    rSlayer Опытный в 1С

    Регистрация:
    31 мар 2009
    Сообщения:
    251
    Симпатии:
    0
    Баллы:
    26
    Нет, округление видимо есть.
    Сумма вычисляется как промежуточное значение, которое потом пишется в движение по регистру накопления. В регистре накопления действительно ресурс число 15,2, но вот например, если сумма получается промежуточная:
    2 708,86849999999999999999999999999999906
    но после выполнения - ЗаполнитьЗначенияСвойств(НовоеДвижение, СтрокаТаблицы);
    В движение попадает число:
    2 708,87.


    И тем неменее вопрос то собственно даже не в этом, а в том, что результатом вычисления:
    3290 * (115.27 / 140) у 1С является не число 2708,845, а 2 708,84499999999999999999999999999999953.
    Разве это корректно?
  4. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!

    Проверьте код, в режиме отладки проверьте те ли числа берет система при рассчете, иначе это действительно косяк 1С, и пдобного косяка я пока не встречал.
  5. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Ну все правильно. Округление 2-го знака после запятой производится по 3-му:
    2 708,8684999999 при округлении 2 708,87
    2 708,8449999999 при округлении 2 708,84
    Так что все правильно и корректно. Добро пожаловать в математику.
  6. TopicStarter Overlay
    rSlayer
    Offline

    rSlayer Опытный в 1С

    Регистрация:
    31 мар 2009
    Сообщения:
    251
    Симпатии:
    0
    Баллы:
    26
    Просьба - внимательнее вникать в суть проблемы.

    да, все числа подставляются правильно. Более того, забиваю напрямую числа , для проверки, вычисляет именно этот результат (см. вложение).

    Вложения:

    • 123.JPG
      123.JPG
      Размер файла:
      32,5 КБ
      Просмотров:
      42
  7. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Ну так в чем проблема? Перепишите, если конфа не на поддержке.
    Код:
    СтрокаТаблицы.Сумма = Окр(?(СтрокаТаблицы.Количество = КоличествоОстаток, мСтрок[0].СуммаОстаток, мСтрок[0].СуммаОстаток * (СтрокаТаблицы.Количество/КоличествоОстаток)),2); 
    
    
    Если на поддержке - сообщите разработчику.

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