Имя: Пароль:
1C
 
Арифметика по 1С
0 Tahallus
 
17.07.12
10:27
Есть такое выражение: 3813.56 - (3813.56/686.44)*343.22
Правильный результат: 1906.78
результат в 1С : 1 906.78000000000000000000000000000000013654

Как с таким бороться?
1 Rie
 
17.07.12
10:27
(0) Изучать, как представлены в компьютеры десятичные числа.
2 Cube
 
17.07.12
10:28
3813.56 - Окр(Окр(3813.56/686.44)*343.22)
3 vladko
 
17.07.12
10:28
Окр(Рез,2)
4 Cube
 
17.07.12
10:29
+(2) Коряво написал, но, думаю, идея понятна...
5 zak555
 
17.07.12
10:30
> (3813.56/686.44)*343.22

напиши так

343.22 * 3813.56/686.44
6 butterbean
 
17.07.12
10:30
(0) упрости выражение
7 Tahallus
 
17.07.12
10:30
(2) Окр то понятно, но механизм типовой, а если у клиента конфа на поддержке, снимать и сидеть везде ставить Окр?
8 НикДляЗапросов
 
17.07.12
10:32
Если Выражение = "3813.56 - (3813.56/686.44)*343.22" Тогда
Ответ = 1906.78
КонецЕсли;
9 Tahallus
 
17.07.12
10:32
(6) был бы мой код то переписал, но это типовой
Бухгалтерия 2.0
Документ ФормированиеЗаписейКнигиПокупок
Функция ЗаполнитьНДСсАвансовПоДаннымРегистраНДСсАвансов_УпрощенныйУчет
10 butterbean
 
17.07.12
10:32
(7) в каком месте типовой видны такие аццкие дроби??
11 butterbean
 
17.07.12
10:33
(9) понятно
12 Tahallus
 
17.07.12
10:33
(10) в (9) написал
13 Cube
 
17.07.12
10:34
(7) Ну, типовой и что?
Вообще не понимаю, что значит "Правильный результат: 1906.78", когда:

1). 3813.56 / 686.44 = 5,555562030184721170094982809859565293

2). 5.555562030184721170094982809859565293 * 343.22 = 1906,77999999999999999999999999999999986346

3). 3813.56 - 1906.77999999999999999999999999999999986346 = 1906,78000000000000000000000000000000013654

Я бы сказал, что ты считаешь не верно...
14 Ненавижу 1С
 
гуру
17.07.12
10:36
(13) то и значит, что он точный
http://www.wolframalpha.com/input/?i=3813.56+-+(3813.56%2F686.44)*343.22+
15 Tahallus
 
17.07.12
10:36
(13) ты случаем не в 1С работаешь7
16 butterbean
 
17.07.12
10:38
(15) ты на калькуляторе пересчитай
17 Stim
 
17.07.12
10:41
одинесники такие одинесники. они будут защищать 1С и разработчиков типовых, как самые упертые фанаты)
18 Tahallus
 
17.07.12
10:42
(13) а ты где так посчитал в "Вычислить выражение" в 1С ?
19 Cube
 
17.07.12
10:43
(14) (15) Результаты расчета деления на 1С на виндовом калькуляторе (win7):

1С). 3813.56 / 686.44 = 5,555562030184721170094982809859565293
W7). 3813.56 / 686.44 = 5,5555620301847211700949828098596

У 1С тупо точность больше. Что не так? Округлили там в уме что-то и кричите, что расчет не верный....
20 Рэйв
 
17.07.12
10:43
(16)У калькулятора ограничено число дигитов на дисплее.Так что при длинных хвостах - он не авторитет, т.к. сам округляет
21 zak555
 
17.07.12
10:44
(18) табло
22 Cube
 
17.07.12
10:44
(15) Нет.
(18) Табло в 1С.
23 butterbean
 
17.07.12
10:44
(20) давай авторитет
24 Ненавижу 1С
 
гуру
17.07.12
10:44
(19) да мне пох где ты там считаешь, я верю в 343.22/686.44 = 1/2
25 iceman2112
 
17.07.12
10:46
(0) а где этот хвост мешает?
26 iceman2112
 
17.07.12
10:46
тогда может и яснее будет как бороться
27 mzelensky
 
17.07.12
10:47
Тоже хочу поговорить на тему "арифметики" в 1С. Только у меня задача более КОСМИЧЕСКАЯ (я быдаже сказал фантастическая):

Есть Реквизит, значение которого расчитывается по произвольной формуле, которую пишет пользователь. Например:

Рек = КолУпак  * (100 / Коэф)

Здесь,  "КолУпак" и "Коэф" - реквизиты в форме (по имени берется его значение).
Результат формулы получаю через "Вычислить". В принципе все работает хорошо!
Но тут встала такая ситуация, что я зная значение "Рек" и "Коэф", а вычислить нужно "КолУпак". Как научить 1С-ку решать простейшие уравнения??? Т.е. человеку не составляет труда переписать первоначальную формулу в :

КолУпак= Рек / (100 / Коэф)

Можно ли решить такую проблему? или проще вводить обратную формулу руками?
28 Tahallus
 
17.07.12
10:48
(3813.56/686.44)*686.44 = 3813.56
в 1С это 3 813.55999999999999999999999999999999972692
зачем такая точность если результат неправильный
29 Ненавижу 1С
 
гуру
17.07.12
10:49
(27) метод деления пополам ))
30 Cube
 
17.07.12
10:50
(28) Математически доказать можешь, что результат не правильный?
31 butterbean
 
17.07.12
10:50
(30) вот это как раз можно, но тут вопрос в другом
32 mzelensky
 
17.07.12
10:51
(29) подбором?
33 Cube
 
17.07.12
10:51
(31) Вперед!
34 iceman2112
 
17.07.12
10:52
(28) где тебе это мешает? или это просто наблюдение?
Просто это нормально, что вместо 6 получаем 5.9999999. (представление числе на компьютере и т.п.)
35 Рэйв
 
17.07.12
10:56
Мля...Да столбиком на бумажке поделите и поймете что правильно, а что нет:-) Скоро без калькулятора в туалет не смогут сходить:-)
36 sol
 
17.07.12
10:57
А в екселе все работает (3813.56 - (3813.56/686.44)*343.22 = 1906.78)!
37 Tahallus
 
17.07.12
10:58
(35) я тоже в шоке от (30)
38 sol
 
17.07.12
10:59
(36) + Давно говорю - Долой калькуляторы, да здравствует ексель.
39 Tahallus
 
17.07.12
10:59
(34) то что описано в (28) немешает в то что в (0) мешает так как потом из этого числа еще вычитается
1906.78 и получается результат 0.000000000000000000000000000000013654 и обработка заполнения документа вываливается с ошибкой
40 Ненавижу 1С
 
гуру
17.07.12
11:01
(32) почти
41 mzelensky
 
17.07.12
11:06
(40) Если формула с прямой зависимостью, то может и прокатит, а если нет и точность должна быть достаточно высокой, ты считать может ОООЧЕНЬ долго.
42 Stim
 
17.07.12
11:06
а почему калькулятор в 1С и вычисления в 1С показывают разные результаты?
43 Cube
 
17.07.12
11:09
(42) Число разрядов разное? Не?
44 dmpl
 
17.07.12
11:13
(0) Результат выражения 3813.56/686.44 представляет собой бесконечную десятичную дробь, а потому при любой точности представления в виде конечной десятичной дроби будут ошибки округления. А компьютер с вещественными числами вообще в виде конечной двоичной дроби работает. И ничего тут не сделаешь, разве что научить компьютер полноценно работать с дробями вместо вещественных чисел.
45 Ненавижу 1С
 
гуру
17.07.12
11:16
(44) есть библиотеки, которые работают с рациональными дробями
46 Wern
 
17.07.12
11:18
(45) только вот зачем они в 1с?
47 dmpl
 
17.07.12
11:22
(45) Ну а что прикажешь делать с иррациональными числами? sqrt(2) или числом Пи, например.
48 Stim
 
17.07.12
11:25
(43) да пох. должен считать одинаково. у машины не может одно колесо катится быстрее другого.
49 dmpl
 
17.07.12
11:28
(48) У машины одно колесо регулярно катится быстрее другого. В повороте, например. Собственно, для этого в коробке передач и стоит пакостник-дифференциал, из-за которого вывешивание одного колеса обездвиживает машину.
50 andrewks
 
17.07.12
11:42
про то, что 4 = 3,99999999999999... уже было?
51 Ненавижу 1С
 
гуру
17.07.12
11:43
(47) запретить ))
52 zak555
 
17.07.12
13:20
(0) посмотри на типовые 1с поделки -- там везде сначала идёт умножение, а потом деление
53 Tahallus
 
17.07.12
13:26
(52) эта ошибка как раз в типовом коде
54 Homer
 
17.07.12
13:39
(0) я не понял в чем ошибка. ТО что 1с не правильно написала формулу или ...
Тебе же написали почему так в (5). А то что 1с перепутала местами слагаемые, ну уж прости 1с, они не специально.
З.Ы. при ОКР() должно уйти.
55 fisher
 
17.07.12
14:02
(53) Почему это ошибка? Типа бизнес-логика подразумевает в этом месте округление до 2 знаков после запятой, но это не учтено в коде? В чем конкретно выражается проблема и почему это проблема? Озвучь наконец.
56 fisher
 
17.07.12
14:05
(55) + Аааа... Типа понял. Из-за последовательности действий возникает погрешность в хренадцатом знаке. Так это вообще проблема машинной арифметики. 1С тут не причем.
57 dmpl
 
17.07.12
14:30
(56) Как раз причем. Уж сколько раз твердили миру: не сравнивайте вещественные числа на равентство. 1С это не учла, хотя должна была учесть.
58 GANR
 
17.07.12
15:01
(0)В данном случае достаточно это
3813.56 - (3813.56 / 686.44) * 343.22
заменить этим
3813.56 - (3813.56 * 343.22 / 686.44)
А вообще надо разработать собственный общий модуль (ООП-то в 1С нет - тогда-бы можно было объект сбацать) для работы со сверхдлинными числами и ПРОСТЫМИ дробями (типа MathCAD-овского) и посылать ему выражения в строковом формате ))))).
59 СвинТуз
 
17.07.12
15:04
3813.56*(1 - 343.22/686.44)
60 СвинТуз
 
17.07.12
15:14
в табло показывает : 1906.78
вы не правильно пишете формулы в 1с
потому что не знаете кое чего ...
все 1с нормально считает
61 DJ Anthon
 
17.07.12
15:16
обработка заполнения табличной части? так исправь, это же можно без вмешательства в конфу сделать, емое
62 Infsams654
 
17.07.12
15:37
Имхо 1С в этом плане неявно. Результат вещественное число не может сравниваться точно с полем, объявление которого с точностью до количества знаков.
Хотя это и хорошо, т.к. отпадают проблемы с округлением до единиц валют (в отличие от скульных баз, где, например, при расчете комиссий и %% это надо учитывать).
С другой стороны, и эта тема неоднократно поднималась здесь, % суммы строк <> сумма % каждой строки
63 DJ Anthon
 
17.07.12
15:40
(62) особенно прикольно алкогольные декларации сдавать. когда требуют И округлять, причем в бОльшую сторону, И недопустимы отклонения ни на йоту, И должны идти суммарные своды с раздельными и остатками предыдущих месяцев. Налицо болбоебизм тех, кто это придумал.
64 Infsams654
 
17.07.12
15:50
(63) Это еще что, а в отчетности кредитных организаций есть форма 101 в Тыс. руб с точностью до 2-х знаков после запятой. В ней надо чтобы актив с пассивом сходился. Наворочено прог чтоб автоматизировать округление. И у гл. бухов сделана форма для ручной корректировки. Если не сходится - ЦБ не примет.
65 DJ Anthon
 
17.07.12
16:02
(64) у вас хоть подогнать можно. а у нас правила арифметики не позволяют.
Основная теорема систематики: Новые системы плодят новые проблемы.