|
Арифметика по 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) у вас хоть подогнать можно. а у нас правила арифметики не позволяют.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |