Имя: Пароль:
1C
 
Округление результата запроса
, ,
0 konst1231
 
24.06.15
15:26
Здравсвуйте,
При вычисления выражения в запросе, получается разный результат, не могу понять почему, вот запрос:

ВЫБРАТЬ
    Док.Сумма / (Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) * 1 * &Курс / &Кратность КАК Сумма,
    Док.Сумма / (Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент) * 1 * &Курс КАК Поле1,
    Док.Сумма * &Курс КАК Поле2
ИЗ
    (ВЫБРАТЬ
        Реализация.Номенклатура КАК Номенклатура,
        Реализация.Коэффициент КАК Коэффициент,
        СУММА(Реализация.Количество) КАК Количество,
        СУММА(Реализация.Сумма) КАК Сумма
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК Реализация
    ГДЕ
        Реализация.Ссылка = &ДокументСсылка
    
    СГРУППИРОВАТЬ ПО
        Реализация.Номенклатура,
        Реализация.Коэффициент) КАК Док


Результат:

Сумма        Поле1        Поле2
554,855      554,85500001     554,855000007
554,855      554,85500001     554,855000007


Исходные данные:
Курс 36,029545455
Кратность 1,000000000
Док.Сумма = 15,4
Док.Количество=Док.Коэффициент=Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент=1
1 konst1231
 
24.06.15
15:27
Платформа 8.3.5.1486
Конфа УТ 103.
База серверная ms sql
2 MadHead
 
24.06.15
15:28
есть при вычислениях числе с плавающей запятой подобные явления, связаны с переводом из двоичной в 10тичную систему счисления
3 MadHead
 
24.06.15
15:29
И не нужно считать стружки от копеек )
4 konst1231
 
24.06.15
15:38
(3) Что и до какого знака округлять чтобы избежать подобной неодназначности?
5 itlikbez
 
24.06.15
15:42
(0) Компьютеры считают не точно. Вы об этом не знали?
6 konst1231
 
24.06.15
15:45
(5) Не точно или м.б. получен разное значений одного и того же выражения?
7 Ненавижу 1С
 
гуру
24.06.15
15:46
Курс 36,029545455

какой-то запредельно точный
8 itlikbez
 
24.06.15
15:48
(6) Может быть. Если считать по-разному, то и результат приближенных вычислений будет разный. Чего тут удивительного?
9 Ненавижу 1С
 
гуру
24.06.15
15:50
надо смотреть план запроса SQL
врзможно движок 1С приводит результаты к разной точности NUMERIC

кстати 554,855000007 точное значение
10 konst1231
 
24.06.15
15:51
(7) В типовой УТ 10.3 есть такая строчка

КурсОплаты                 = ?(Выборка.СуммаВзаиморасчетов = 0, 0, Выборка.СуммаРегл/Выборка.СуммаВзаиморасчетов);

Далее этот курс без округления передается в запрос. Используется для печати т12
11 Ненавижу 1С
 
гуру
24.06.15
15:52
база какая?
12 konst1231
 
24.06.15
15:53
(8) Ок допустим не удивительно, вопрос, как уйти от недоназначности
13 konst1231
 
24.06.15
15:54
(11)

Платформа 8.3.5.1486
Конфа УТ 103.
База серверная ms sql
14 itlikbez
 
24.06.15
15:55
(12) Округлять.
15 Fragster
 
гуру
24.06.15
15:55
16 Ненавижу 1С
 
гуру
24.06.15
15:56
оберни все выражения в ВЫРАЗИТЬ(... КАК ЧИСЛО(18,Точность))
17 konst1231
 
24.06.15
15:56
(14) До какого знака, и что
18 ХардHard
 
24.06.15
15:57
(17) Точность = 2 . Округляй финальный результат.
19 itlikbez
 
24.06.15
15:58
(17) До любого, результат.
20 konst1231
 
24.06.15
15:58
(18) А почему именно 2?
21 Ненавижу 1С
 
гуру
24.06.15
16:00
(20) потому что деньги в РФ принято округлять до копеек
22 ХардHard
 
24.06.15
16:01
(21) Может у него все поля цена/сумма в базе имеют точность 10  знаков. %)
23 konst1231
 
24.06.15
16:02
У меня задача посчитать погрешность округления при по строчном вычислении сумм в накладной
24 Fragster
 
гуру
24.06.15
16:03
это вы себестоимость одного шурупа при комплектации не считали...
25 ХардHard
 
24.06.15
16:04
(24) Думается мне , тут такой задачи и близко не стоит.

(23) А в накладной сколько знаков точность? С чем сравнивать собрался?!
26 konst1231
 
24.06.15
16:07
(25) Вопрос же не про копейки. Почему решили что при окгруглении до 2-х знаков результат в общем случае будет одинаковый, а при округлении до 9 знаков разный?
27 konst1231
 
24.06.15
16:09
(16) при если все выражени обернуть в ВЫРАЗИТЬ( как ЧИСЛО(18, 9)) - результат такой же как в (0)
28 Fragster
 
гуру
24.06.15
16:11
(27) внимательно прочитай (15)
29 ХардHard
 
24.06.15
16:11
(26)(27)
Короче , тебе заняться нечем , да?
30 Fragster
 
гуру
24.06.15
16:11
точность 18 прокатывает при двух операндах
31 konst1231
 
24.06.15
16:12
(28) пошел читать
32 Fragster
 
гуру
24.06.15
16:12
тебе нужно не каждый в 18 приводить, а вложенно, типа Выразить(Выразить(Выразить(аб как число(18,8))в как число(18,8))...)
33 itlikbez
 
24.06.15
16:13
(26) Приближенные вычисления производятся с определенной точностью. Эта точность практически (!) всегда больше двух знаков.
34 konst1231
 
24.06.15
16:23
(32) Ок, спасибо, буду пробовать и осмысливать статью. А на файловой интересно базе, исходя из (15) такого быть не должно?
35 hhhh
 
24.06.15
16:24
(33) точность результата зависит от точности исходных данных. У ТС поле Сумма округлена до 3х знаков, значит и в результате мы можем доверять только 3м знакам после запятой, остальные цифры случайные, мусор. У ТС так и есть Поле1 = Поле2 = 554,855
36 Ненавижу 1С
 
гуру
24.06.15
16:26
(35) это не совсем так, при умножении точность результата равна сумме точностей множителей
37 Ненавижу 1С
 
гуру
24.06.15
16:28
интересно, эта особенность видимо сильно зависит от СУБД и не является универсальной
38 konst1231
 
24.06.15
16:33
(35) Поле сумма не округлена до 3-х знаков. Тип реквзита сумма РТиУ  число 15.2
39 hhhh
 
24.06.15
16:37
(36) Берем пример:  2.5 * 2.5 = 6.25

так так числа приближенные, с точностью 0.1, Значит в реальности они могут принимать любые значения от 2.45 до 2.55. То есть произведение будет в диапазоне 2.45*2.45 и 2.55*2.55.

получаем 6.0025 <= Результат <= 6.5025

то есть точность вычисления (6.5 - 6) / 2 = 0,25
40 hhhh
 
24.06.15
16:38
(38) значит вы и третье цифре не можете доверять. ОТвет тогда 554,86
41 МаксимМП23
 
24.06.15
16:50
(0) а "* 1 * " в выражении - это какая-то личная фишка?
42 ХардHard
 
24.06.15
17:17
(41) ТС затейник тот еще.
Закон Брукера: Даже маленькая практика стоит большой теории.