|
v7: Почему не равно? | ☑ | ||
---|---|---|---|---|
0
Масянька
15.01.14
✎
11:23
|
Доброе утро!
Чёт мне кажется, что я сошла с ума..... Процедура Анализ() Если СуммаОстаткиТМЦ = СуммаПоПартиямТМЦ Тогда Форма.НадписьСуммаОстаткиТМЦ.Цвет(0, 0, 128); Форма.НадписьСуммаПоПартиямТМЦ.Цвет(0, 0, 128); Иначе Форма.НадписьСуммаОстаткиТМЦ.Цвет(255, 0, 0); Форма.НадписьСуммаПоПартиямТМЦ.Цвет(255, 0, 0); КонецЕсли; КонецПроцедуры // Анализ Выводит: ост = 947211.85, парт = 947211.85 ост = Число, парт = Число не равно (вставила сообщить). Почему не равно-то? Спасибо. |
|||
82
Масянька
15.01.14
✎
11:57
|
Ладно, пусть не 2 после запятой.
Почему выводит (без округления) всего 2? (80) Однозначно! |
|||
83
zak555
15.01.14
✎
11:57
|
(80) что это ?
|
|||
84
Масянька
15.01.14
✎
11:57
|
(75) А не красивой не стал бы помогать :(
|
|||
85
Bigbro
15.01.14
✎
11:57
|
(82) а вот на этот вопрос кроме разработчиков 1с вряд ли кто то ответит..
|
|||
86
Wobland
15.01.14
✎
11:57
|
(82) поэтому и растут волосы на руках у тех, кто сообщает
|
|||
87
VladZ
15.01.14
✎
11:58
|
(82) Нужно смотреть, откуда у тебя взялось это число. Может ты запросом получала (там одна точность), а потом в ТЗ выгружала (там другая точность).
|
|||
88
Масянька
15.01.14
✎
11:59
|
(85) Феерично :)
(87) Там довольно сложно: запрос, доп. расчеты, остатки.... Не выгружала. |
|||
89
Масянька
15.01.14
✎
12:00
|
Ладно, дядьки - СПАСИБО!
Всем чмоки :))) |
|||
90
ЧеловекДуши
15.01.14
✎
12:02
|
(88) Запрос покажи :)
|
|||
91
Масянька
15.01.14
✎
12:02
|
(77) А скрины - жду...
|
|||
92
zak555
15.01.14
✎
12:07
|
за свою жизнь лично видел только одну девушку, которую можно назвать программист
|
|||
93
ЧеловекДуши
15.01.14
✎
12:11
|
(92) Ну и как она тебе?
|
|||
94
zak555
15.01.14
✎
12:12
|
(93) так же был удивлён, что ум и красота на месте
|
|||
95
Масянька
15.01.14
✎
12:13
|
(77) Так ждать?
|
|||
96
aka AMIGO
15.01.14
✎
12:13
|
(89) для начала - в конфигураторе ставишь курсор приблизительно туда, где интересное место в коде
далее - нажимаешь на иконку внизу: http://gyazo.com/17067361f6190f60232231cc7dbd0f81 попадаешь в отладчик, курсор стоит на нужном тебе месте. далее жмакаешь 2 раза на желтой вертикальной полоске напротив строки, где тебе надо остановить выполнение: http://gyazo.com/bb4fa1d650782f11e6bd59d88109c2ea дальше - открываешь табло, жмакнув на иконке вверху: http://gyazo.com/0c794fb477f98c07902cd07d63b73073 в окне табло печатаешь имя переменной, или копипастишь его из окна кода: http://gyazo.com/4ae07e302d918eb371d0ecda3be6841f |
|||
97
aka AMIGO
15.01.14
✎
12:13
|
(95) торопишь меня :) жди :)
|
|||
98
Масянька
15.01.14
✎
12:14
|
(97) Окей! Прости :)
PS Люблю. Жду. Лена (С) |
|||
99
dedmoroz777
15.01.14
✎
12:19
|
(98) Не мешай! Все ждут)
|
|||
100
Масянька
15.01.14
✎
12:19
|
Мне?
|
|||
101
1dvd
15.01.14
✎
12:23
|
Я не понял. Она стукнулась или нет?
|
|||
102
Simod
15.01.14
✎
12:24
|
Сообщить(?(Цел(СуммаОстаткиТМЦ*100)/100 = СуммаОстаткиТМЦ, "Равно", "Не равно"));
Сообщить(?(Цел(СуммаПоПартиямТМЦ*100)/100 = СуммаПоПартиямТМЦ, "Равно", "Не равно")); |
|||
103
aka AMIGO
15.01.14
✎
12:25
|
+96 идешь в 1С-Предприятие, вызываешь на выполнение свой отчет:
http://gyazo.com/7fb44e92d8654d683b06613a02c237b1 автоматом попадаешь в отладчик, в котором видно каретку, - останов в указанной тобой точке: http://gyazo.com/b6764eef8e8a0e762699879c97c9d428 а в табло видишь значения переменных, как раз на момент в точке останова.. итого - выбирай место останова, ставь точку останова, запускай программку, наслаждайся результатами :) Для управления выполненим программы - иконки на верхней границе окна отладчика Для продолжения по шагам - нажимай иконку: http://gyazo.com/c19881be73ea1143b6e9349d7bd0919e Для завершения - одну из двух: http://gyazo.com/6c08a6ec9c035aee172f92be4c353574 вроде всё :) успеха! :) |
|||
104
aka AMIGO
15.01.14
✎
12:26
|
(101) "не дождетесь!" © :)
|
|||
105
Масянька
15.01.14
✎
12:28
|
(103) Огромное СПАСИБО! Персональные чмоки :)))))))))
Щас в ворд сложу, картинки вставлю. Короче, кому надо потом будет - говорите. Автор - aka AMIGO, редактор - я :)))) |
|||
106
Torquader
15.01.14
✎
12:34
|
Кстати, для тех, кто хочет понять - в чём дело.
1С к точности дробной части относится очень "сурово" // проверка точности 1С A=1; B=1; I=1; Пока 1=1 Цикл C=A+B; Если C=A Тогда Сообщить("Обнаружена точность:B="+Строка(B)); Прервать; КонецЕсли; Если I>1000 Тогда Сообщить("Превысили допустмый предел:С="+Строка(C)+",A="+Строка(A)); Прервать; КонецЕсли; B=B*0.1; I=I+1; КонецЦикла; Выводит: Превысили допустмый предел:С=1,A=1 То есть система может отслеживать 1000 знаков ? |
|||
107
aka AMIGO
15.01.14
✎
12:36
|
(105) пожалуйста :)
кстати, в табло можно помещать и функции/операторы, чтобы увидеть из результаты: http://gyazo.com/9c83b3f3e8adb9e4adf826896aad26d6 |
|||
108
Масянька
15.01.14
✎
12:39
|
(106) За все время - впервые с таким столкнулась. Предупреждать надо :(
|
|||
109
Torquader
15.01.14
✎
12:40
|
(106) Хотя, в некоторых операциях 1С "ошибается":
A=2; B=3; C=A/B; D=C*10000000000000000000000000000000000000000000000000; Сообщить("D="+Строка(D)); Получаем: D=6666666666666666666666666660000000000000000000000 То есть точность 27 знаков. |
|||
110
Сисой
15.01.14
✎
12:40
|
(0) В Такси! Только в такси!
|
|||
111
Torquader
15.01.14
✎
12:41
|
(108) Вообще, не знаю как в 1С, но в других системах, если мне нужна точность, то я считают в целых числах, смещённых до нужной точности - тогда гарантированно два числа будут совпадать, если они и на выводе совпали.
|
|||
112
Torquader
15.01.14
✎
12:41
|
(110) Думаешь, что там движок вычислений сильно переписали ?
|
|||
113
Масянька
15.01.14
✎
12:42
|
(111) Об том и речь - я получила числа, ничего с ними не делала, пытаюсь сравнить. Даже на экран вывела :(
|
|||
114
zak555
15.01.14
✎
12:44
|
(110) это ответственная работа
|
|||
115
1dvd
15.01.14
✎
12:45
|
Если женщина по определению не может быть программистом, думаете, она может быть таксистом?
|
|||
116
catena
15.01.14
✎
12:46
|
(113), как это ничего не делала, когда (88)?
|
|||
117
aka AMIGO
15.01.14
✎
12:48
|
забавна работа оператора Окр() с точностью до 2-х знаков после запятой:
http://gyazo.com/7437221f177fc103545cbdf270bfbbbd |
|||
118
Torquader
15.01.14
✎
12:49
|
(115) Да быть можем всем, чем угодно, только вот хорошим программистом, как и хорошим таксистом - вряд ли - да и среди мужчин хороших программистов тоже не очень много.
|
|||
119
aka AMIGO
15.01.14
✎
12:49
|
+117 вроде бы должны быть равны, ан нет! :)
|
|||
120
Torquader
15.01.14
✎
12:50
|
(117) Нет, а что ты хотел - это же округление, а не отбрасывание дробной части.
Там же ещё параметр есть, как округлять 1.5 в 2 или в 1. |
|||
121
Bigbro
15.01.14
✎
12:51
|
117 с чего бы они должны быть равны?
|
|||
122
Torquader
15.01.14
✎
12:51
|
(119) Меня больше 106 поразило - проверка точности алгоритма, знакомая со времён ассемблера, показала, что в 1С про ассемблер и сопроцессор не слышали.
|
|||
123
Torquader
15.01.14
✎
12:52
|
(121) С точки зрения программиста 1С, видимо.
|
|||
124
aka AMIGO
15.01.14
✎
12:53
|
(118) я встретил двух женщин-программисток, обе были программистки искрой божьей ..
работали мы в ВЦ, на ЕС-1020, делали огромадные расчеты, девушки справлялись запросто. (121) в принципе принимается значение, установленное в окне свойств конфигурации. У меня - типовые настройки (123) кхм.. :) |
|||
125
aka AMIGO
15.01.14
✎
12:54
|
(120) точно, друже :)
|
|||
126
Масянька
15.01.14
✎
12:57
|
Да о чем вы? :))))
Меня в ступор просто вогнало: получила число, вывела на экран - а это не то число... |
|||
127
CaMoJleT
15.01.14
✎
12:58
|
(126) Удивительное рядом :)
|
|||
128
aka AMIGO
15.01.14
✎
13:00
|
(122) да слышали они, конечно..
однозначно сталкивались в Си с точностью и двойной точностью числовых переменных это и есть ограничение, следствие которого видно как раз в (109) |
|||
129
aka AMIGO
15.01.14
✎
13:02
|
+128 я уже не помню, увы, порядок двойной точности.. восьмеричный код там
|
|||
130
Torquader
15.01.14
✎
13:10
|
(126) Это вы с числами double не работали - я, например, в научной работе их "сравнивал" побайтово - тогда действительно была гарантия, что числа совпадают только тогда, когда их представления совпадают.
А вывод на экран - он никогда правильно не работает. |
|||
131
Принт
15.01.14
✎
13:12
|
(130) и то, есть вероятность натолкнуться на +0/-0 )
|
|||
132
Torquader
15.01.14
✎
13:13
|
(128) В (109) Показано, что результат операции деления просто получают из сопроцесссора, у которого точность где-то 17-18 знаков в дробной части.
А вот сложение, видимо, они отработали, как умели. |
|||
133
Torquader
15.01.14
✎
13:14
|
(131) С точки зрения математики - это два разных числа, так что не страшно.
|
|||
134
aka AMIGO
15.01.14
✎
13:15
|
(132) или "как смогли" :)
|
|||
135
Принт
15.01.14
✎
13:15
|
(133) впервые слышу
|
|||
136
Bigbro
15.01.14
✎
13:19
|
(126) у Козьмы Пруткова в практике помнится был аналогичный случай .. ))
|
|||
137
Масянька
15.01.14
✎
13:20
|
Итак, в отладчике показывает
СуммаОстаткиТМЦ = 947228.01 СуммаПоПартиямТМЦ = 947228.01 И что же я должна думать? |
|||
138
Wobland
15.01.14
✎
13:22
|
(137) перенеси остатки в БП 3.0 и там посчитай
|
|||
139
Масянька
15.01.14
✎
13:22
|
Кстати, остановка стоит тут - Если Окр(СуммаОстаткиТМЦ,2) = Окр(СуммаПоПартиямТМЦ,2) Тогда
А выводит то, что реально или округленное? |
|||
140
Torquader
15.01.14
✎
13:22
|
(137) Если тебе хочется, чтобы числа сравнивались, как на экране (что, для некоторых людей вполне логично), то пиши просто: Если Строка(СуммаОстаткиТМЦ)=Строка(СуммаПоПартиямТМЦ)Тогда
Конечно, математики за такое яйца оторвут, но вам это не грозит. |
|||
141
Принт
15.01.14
✎
13:22
|
(137) 1С - 3,1421-ы
|
|||
142
Torquader
15.01.14
✎
13:23
|
(135) При рассмотрении пределов важно +0 или -0.
И при точном сравнении, если А>B, то A-B не может быть -0. |
|||
143
Масянька
15.01.14
✎
13:24
|
(140) Мне надо правильно :(
(141) Пушистая северная лисичка :( |
|||
144
Bigbro
15.01.14
✎
13:24
|
выводит то что в отладчике запрошено. можно любые формулы ввести в табло в том числе с округлениями.
|
|||
145
Масянька
15.01.14
✎
13:25
|
(144) В табло забила:
СуммаОстаткиТМЦ СуммаПоПартиямТМЦ |
|||
146
Simod
15.01.14
✎
13:26
|
(137) Перезагрузись.
Код из (102) проверяла? |
|||
147
Bigbro
15.01.14
✎
13:32
|
хотя с другой стороны отладчик писали те же люди из 1с ... ))
|
|||
148
alexiv79
15.01.14
✎
13:35
|
(145) Попробуй каждое число умножить допустим на 100 000 и сравнить
|
|||
149
alexiv79
15.01.14
✎
13:36
|
+(148) СуммаОстаткиТМЦ и СуммаПоПартиямТМЦ - это реквизиты или переменные?
|
|||
150
Масянька
15.01.14
✎
13:37
|
(149) Уже переменные.
|
|||
151
Принт
15.01.14
✎
13:38
|
(142) тогда почему операция сравнения в сопроцессоре говорит -0 == +0? )
|
|||
153
ЧеловекДуши
15.01.14
✎
13:38
|
(150) Уже, в какой именно момент наступило? :)
Покажи весь код :) Лучше выложи обработку на файло помойку... |
|||
154
aka AMIGO
15.01.14
✎
13:39
|
(139) - в окне сообщений - округленные, а в отладчике - реальные
|
|||
155
Torquader
15.01.14
✎
14:13
|
(151) С точки зрения работы сопроцессора - да - это нули.
С точки зрения стандарта представления чисел - это разные записи. P.S. там ещё и не число есть, если кому интересно. |
|||
156
Torquader
15.01.14
✎
14:21
|
(150) Вот тебе функция, которая показывает, что внутри числа:
Функция ВывестиЧислоКакЕсть(пчЧислоДляВывода) лчЦелаяЧасть=Окр(пчЧислоДляВывода,0,1); Если лчЦелаяЧасть>пчЧислоДляВывода Тогда лчЦелаяЧасть=лчЦелаяЧасть-1;КонецЕсли; лстрСтрокаЧисла=Строка(лчЦелаяЧасть)+"."; лчДробнаяЧасть=пчЧислоДляВывода-лчЦелаяЧасть; Пока лчДробнаяЧасть<>0 Цикл лчДробнаяЧасть=лчДробнаяЧасть*10; лчЦелаяЧасть=Окр(лчДробнаяЧасть,0,1); Если лчЦелаяЧасть>лчДробнаяЧасть Тогда лчЦелаяЧасть=лчЦелаяЧасть-1;КонецЕсли; лстрСтрокаЧисла=лстрСтрокаЧисла+Строка(лчЦелаяЧасть); лчДробнаяЧасть=лчДробнаяЧасть-лчЦелаяЧасть; КонецЦикла; Возврат лстрСтрокаЧисла; КонецФункции Попробуй вывести свои две переменные через неё - увидишь что-то интересное. |
|||
157
Принт
15.01.14
✎
14:23
|
(155) поднял http://ru.math.wikia.com/wiki/Отрицательный_и_положительный_ноль
+ https://ru.wikipedia.org/wiki/Отрицательный_и_положительный_ноль с этой точки зрения -0, +0, 0 - различные, не смешиваемые в одной куче сущности |
|||
158
alexiv79
15.01.14
✎
14:27
|
(150) Могу ошибаться, но по-моему тема такая - в реквизите ставишь формат 15.2. Он подставляет реальное число в реквизит - допустим 15.078000, но показывать будет все равно 15.08
|
|||
159
Torquader
15.01.14
✎
14:32
|
(158) После того, как "реальное" число было присвоено реквизиту с точностью 15.2, в нём будет лежать число с точностью 15.2 вне зависимости от того, что в него положили.
С ячейками таблицы значений, для которых задан тип и точность, происходит тоже самое. |
|||
160
Torquader
15.01.14
✎
14:35
|
(157) Меня больше удивило, что (156) показало сто нулей после запятой и одну единицу в моём примере из (106), правда я I уменьшил до ста.
Вывод - на 1С можно делать математические расчёты ничего не зная про проблемы вычислений с плавающей точкой на компьютерах (в отличие от Excel, которая в трёх знаках уже врёт). |
|||
161
Масянька
15.01.14
✎
14:35
|
(156) Спасибо - попробую.
(158) Переменные (в модуле обработки). Формат на них не накладывался. Кстати, попробовала (102): СуммаОстаткиТМЦ - не равно, СуммаПоПартиямТМЦ - равно. |
|||
162
alexiv79
15.01.14
✎
14:35
|
(159) Понятно - ну так значит так. Вот только вопрос - если это реквизиты - почему сумма не сходится? Если в сообщении выводится "ост = 947211.85, парт = 947211.85"
|
|||
163
Принт
15.01.14
✎
14:37
|
(160) меня удивляет, почему они при этом заставляют работать с дробями как на сопре
|
|||
164
Масянька
15.01.14
✎
14:39
|
(156) Вот что вернуло:
остатки = 947211.849999999999999999999999997999994279 партии = 947211.85 |
|||
165
Масянька
15.01.14
✎
14:40
|
+(164) Но в отладчике - другие цифры (гы-гы-гы).
По-моему, как раз в (156) и есть нормальный отладчик (для данной ситуации). СПАСИБО!!!!!!!!! |
|||
166
Масянька
15.01.14
✎
14:47
|
(156) Вот это - настоящий инженер!
PS На первом курсе универа: по вышке были какие-то расчеты по таблицам Брадисам. Не получается и все тут. Иду к соседу. А он еще не начал это задание делать. А к нему приехал старший брат (2 года назад окончил наш универ по ТММ). Брат - лежит в постели, читает какую-то книжку. Брат говорит: "Давай сюда свое задание." Читает, думает около 2 минут и выдает ответ. Я ошалело говорю соседу: "Вот это - настоящий инженер!". |
|||
167
Torquader
15.01.14
✎
14:58
|
(166) Ладно - вы с восьмёркой познакомитесь - будете вывод числа в строку переписывать, чтобы без пробелов было.
Потому как ЧРГ=;нифига не отключает, хотя, вроде бы ЧГ=0; помогает. |
|||
168
Масянька
15.01.14
✎
15:19
|
(167) Пройденный этап :) Но я снеговика не люблю....
|
|||
169
ЧеловекДуши
15.01.14
✎
15:21
|
(167) В 8-ке свои грабли :)
|
|||
170
ЧеловекДуши
15.01.14
✎
15:21
|
(164) Ну вот, опять чудо не получилось :)
|
|||
171
Torquader
16.01.14
✎
11:22
|
Кстати, не стоит пробовать вывести через (156) отрицательные числа - для способных предлагается доработать функцию под вывод отрицательных чисел.
|
|||
172
Масянька
16.01.14
✎
12:29
|
Ну, раз вы не унимаетесь: мне все-таки очень интересно - где хранится реальное число?
Сообщить, в том числе и преобразованное в строку, отладчик - выводят всего 2 цифры. А сравнивает - реальное число. Где оно лежит?! |
|||
173
VladZ
16.01.14
✎
14:46
|
(172) Не поверишь - в памяти! :)
|
|||
174
Torquader
16.01.14
✎
14:51
|
(172) Причём, похоже, что в целом виде с отдельным указанием порядка - скорость работы с такими числами возрастает пропорционально их длине - это я вчера проверял.
Так что, в этом случае, 1С заслуживает уважения - потери точности практически не происходит. |
|||
175
Принт
16.01.14
✎
14:55
|
||||
176
Масянька
16.01.14
✎
15:00
|
(173) Ага - не поверю :))))
ИМХО, это и есть моветон: пользователь может увидеть только 2 цифры после запятой, а реально сравнивается 20 цифр после запятой. (174) Ну, да. Сколько лет работаю - впервые наступила на эти грабли. И не один раз сравнивала суммы. |
|||
177
Пятничник
16.01.14
✎
16:41
|
(80) (83) вот и выросло поколение одинэсников, которые не знают, что такое clipper... :-)
|
|||
178
aka AMIGO
16.01.14
✎
16:49
|
(177) да просто за ненадобностью :)
|
|||
180
Пятничник
16.01.14
✎
16:58
|
(172) правильный вопрос - не ГДЕ оно хранится, а КАК.
В Клиппере (и ДБФ) были указатели точности хранения (количество десятичных знаков). в 1С решили обойтись без них (хотя вроде в 8.3 экспериментируют с ними). (176) если б у вас только сумма и произведение были - было бы легче, но если хотя бы 1 раз возникает деление - точность результата не столь очевидна. |
|||
181
Torquader
16.01.14
✎
21:05
|
(180) Одно дело - в базе данных - там точность чисел ограничена, а в памяти - каждый может хранить всё, что хочет.
Стандартная ситуация - умножение на количество и деление на другое количество - и чаще всего - ошибка округления. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |