Столкнулся с такой бедой - не могу понять как решить да и вообще откуда "ноги растут"

есть запрос - довольно длинный, не суть в его логике, но на выходе имеем следующее

```1c
    ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) + Таблица.Количество) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров)
```

Обороты.КоличествоВЕдиницеОстатковОборот, Обороты.КоличествоВЕдиницеОтчетовОборот - ресурсы полученные из регистра их точность до 5 знаков, в данном случае они оба равны 0.

переменные
 Таблица.Количество = 67,55
 Таблица.КоличествоМетров = 76 069,81981982

если вывести из запроса выражения, то они так же равны (т.е. потери точности тут НЕТ)
ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) + Таблица.Количество = 67,55
ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров = 76 069,81981982

результат же этого деления равен 0,000887
хотя если делить на калькуляторе 67,55 / 76 069,81981982 = 0,0008879999999999979

т.е. тупо выбрасываются знаки после 6 го
пробовал что то вроде ВЫРАЗИТЬ КАК Число(15,6), ВЫРАЗИТЬ КАК Число(15,7)

результат тот же 0,000887

может кто сталкивался что это и как бороться ? может особенность работы SQL какая
можно выйти из положения произведя это деление в коде вне запроса, но всё же хотелось бы разобраться
---
ВЫРАЗИТЬ КАК Число(15,7) нужно применять к 0.
Как-то так:

```1c
    ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, ВЫРАЗИТЬ 0 КАК Число(15,7)) + Таблица.Количество) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, ВЫРАЗИТЬ 0 КАК Число(15,7)) + Таблица.КоличествоМетров)
```

или даже лучше так:

```1c
    (ВЫРАЗИТЬ(ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) + Таблица.Количество КАК Число(15,7))) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров)
```
---
ВЫРАЗИТЬ КАК Число(15,7) нужно применять к 0.
Как-то так:

```1c
    ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, ВЫРАЗИТЬ 0 КАК Число(15,7)) + Таблица.Количество) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, ВЫРАЗИТЬ 0 КАК Число(15,7)) + Таблица.КоличествоМетров)
```

или даже лучше так:

```1c
    (ВЫРАЗИТЬ(ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) + Таблица.Количество КАК Число(15,7))) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров)
```
---
Спасибо, так и есть оказывается

если переписать так

```1c
    (ВЫРАЗИТЬ(ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) КАК Число(15,5)) + Таблица.Количество) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров)
```

то результат уже оказывается 0,0008879999999
вот что интересно точность в выразить оставляю туже 5 (как у поля регистра), к другому выражению (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0))
 - выразить не применяю вообще и это "округление" вдруг пропадает - чудеса да и только

видимо, ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) возвращает какое то не совсем число )
---
видимо, ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) возвращает какое то не совсем число )
Обороты.КоличествоВЕдиницеОстатковОборот скорее всего Null. Тогда это выражение возвратит просто 0. А 0 не имеет точности.
---
да так и есть, но как понять 0 не имеет точности:
откуда все же берется это "обрубание" и почему именно после 6 знаков, а не сколько нибудь еще ?
---
это просто на конкретно этих данных так получилось. С другими данными будет другая точность.
И такой эффект дает именно ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0). Если просто подставить 0, то округлять будет более точно.
---
можно попробовать добавить и отнять в запросе число 0.000001 (или сколько надо).
Обычно скуль приводит числа к первому в выражении.
---
0.000001

написал
0.0000001+(ЕСТЬNULL(Обороты.КоличествоВЕдиницеОстатковОборот, 0) + Таблица.Количество) / (ЕСТЬNULL(Обороты.КоличествоВЕдиницеОтчетовОборот, 0) + Таблица.КоличествоМетров)

однако, выдает тоже самое (
---
```1c
    ВЫБРАТЬ
    ВЫРАЗИТЬ(67.55 КАК ЧИСЛО(20, 2)) КАК Число1,
    ВЫРАЗИТЬ(76069.81981982 КАК ЧИСЛО(20, 8)) КАК Число2
    ПОМЕСТИТЬ ВремТаб
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВремТаб.Число1,
    ВремТаб.Число2,
    (ВремТаб.Число1) / (ВремТаб.Число2) КАК НеправильноеЧисло,
    ВЫРАЗИТЬ(ВремТаб.Число1 КАК ЧИСЛО(20,8)) / (ВремТаб.Число2) КАК ПравильноеЧисло
    ИЗ
    ВремТаб КАК ВремТаб
```
---
Зависит от субд, для ms sql: https://msdn.microsoft.com/ru-ru/library/ms190476.aspx
---
Спасибо, вот это несколько проливает свет откуда берется эта цифра

как пишут Точность результата = max(s1, s2) + max(p1-s1, p2-s2) + 1

т.е. видимо из за этого "+1" именно 6 знаков после запятой т.к. учавствуют обороты регистра у которых точность 5 знаков
---
Хотя, лучше переписать запрос так, чтобы ещё и умножить в самом запросе. Зуб даю, вы потом эту маленькую величину где-то потом умножаете.
---
с указанной временной таблицей то да всё правильно будет, видимо тут вся хитрость в обращении именно в базу
и вот пропробовал исключить выражения из регистров оставил тупо

Таблица.Количество / Таблица.КоличествоМетров это выдает 0,00088799999999

значение явно тут дальше не используется, оно заносится в регистр сведений и должно быть там верное
---
Столкнулся тоже вчера с такой проблемой, помогло перестроить вычисление без скобок, которые меняют приоритет вычисления. Так и не разобрались
---
Тоже долго не мог понять корень проблемы, но увидев эту тему решил вопрос аналогичным способом. В моем случае была конструкция разработчиков 1С:

```1c
    | СУММА(
    | ВЫРАЗИТЬ(СтоимостьТоваров.Стоимость * СтоимостьТоваров.Количество
    | / Обороты.Количество КАК ЧИСЛО (23, 10))) КАК Стоимость,
```

и это работало некорректно, заменил так:

```1c
    | СУММА(
    | ВЫРАЗИТЬ(СтоимостьТоваров.Стоимость * СтоимостьТоваров.Количество КАК ЧИСЛО (23, 10))
    | / Обороты.Количество) КАК Стоимость,
```

и все стало считаться корректно.
Спасибо за решение проблемы!