Имя: Пароль:
1C
1С v8
Почему 1с округляет число 0.03472 как 0.03
,
0 Nesh
 
28.10.16
22:10
Почему число 0.03472 1с округляет Окр(0.03472,2) как 0.03? Так задумано, или это общеизвестный баг (фича)?
1 Lama12
 
28.10.16
22:16
(0) Это школьная математика.
2 Nesh
 
28.10.16
22:19
Почему тогда эксель это видит как 0.04?
3 Euguln
 
28.10.16
22:20
(2) Неправда
4 Лефмихалыч
 
28.10.16
22:22
Потому, что у Окр три параметра, а не два
5 mehfk
 
28.10.16
22:22
Ну вот, еще однго одинэсника пора обратно в ассенизаторы списывать.
6 Nesh
 
28.10.16
22:22
Правда, он не проставляет справа от разряда округления все числа 0-ми.
7 Euguln
 
28.10.16
22:24
(6) Какие ваши доказательства?
8 Лефмихалыч
 
28.10.16
22:25
хмм...
9 Euguln
 
28.10.16
22:26
ОКРУГЛВВЕРХ(0,03472;2) = 0,04
ОКРУГЛ(0,03472;2) = 0,03
вот что выдает Excel
10 Лефмихалыч
 
28.10.16
22:26
А и правда - почему?..
https://i.imgur.com/LTK4VqU.png
11 Nesh
 
28.10.16
22:28
(9) Я рассчитывал что в 1с Окр(;2) = ОКРУГЛВВЕРХ(;2) в екселе.
12 Euguln
 
28.10.16
22:29
(11) Для таких целей специально придумали СП, чтобы не рассчитывать.
13 Лефмихалыч
 
28.10.16
22:31
(12) с Окр15как20 все равно 0.03 возвращает
14 mkalimulin
 
28.10.16
22:32
(11) Еще и не такое бывает. Например, остаток от деления в 1С один, в Excel другой, а в учебнике по математике третий.
15 Euguln
 
28.10.16
22:33
(13) Опять же:
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
т.е.

Окр(0.035,2) = 0.03
Окр(0.035,2,РежимОкругления.Окр15как20 ) = 0.04
16 Nesh
 
28.10.16
22:34
(12) Не надо включать слишком умного.

Вот из СП выдержка:

Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.

Все мы знаем, как местами в СП сухо описано...
17 Euguln
 
28.10.16
22:35
В то время же как в Excel ОКРУГЛВВЕРХ округляет число до ближайшего большего по модулю.
18 Nesh
 
28.10.16
22:35
(15) Это вообще о другом.
Окр(0,03472,2) = 0.03
Окр(0,03472,2,РежимОкругления.Окр15как20 ) = 0.03
19 Nesh
 
28.10.16
22:36
(17) Правильно. Почему в 1С не так округляет?
20 Euguln
 
28.10.16
22:36
(16) Можно иногда дочитывать описание до конца, можно узнать много интересного.
21 Euguln
 
28.10.16
22:37
(19) А почему должна?
22 wertyu
 
28.10.16
22:43
(21) так пятница же )
23 Лефмихалыч
 
28.10.16
23:17
(15) с 0.035 вопросов нет. Вопросы есть с 0.0347, которые, с точки зрения арифметики, должны округляться до 0.04, но фактически этого не происходит (10)
24 Cyberhawk
 
28.10.16
23:38
(23) Потому что по правилам округления до сотых нужно отбросить все цифры после той, что вторая после запятой. А ты походу хочешь, чтобы 1С округлила сначала до тысячных, а затем этот промежуточный результат до сотых? А с хрена ли?
25 Aleksey
 
28.10.16
23:38
(23) С точки зрения какой арифметики? Американской? Нас в, русских школах, учили что 0,0347 это 0,03. Если некоторых шпионов забугром учили по американским учебникам, то это не проблема 1С
26 Cyberhawk
 
28.10.16
23:40
(25) Походу буржуйский Эксель округляет с самого конца и на выходе выдает цепочку округлений округлений округлений ...
27 Лефмихалыч
 
28.10.16
23:44
(25) (24) странно. Меня в русской школе учили, что округлять надо, прибавляя единицу к старшему разряду, если младший >= 5, без всяких так отбрасываний чего бы то ни было. Чо жил, то зря...
28 Cyberhawk
 
28.10.16
23:46
(27) Я это и имел в виду, просто не стал дописывать про условие, которое потом (после отбрасывания) надо проверить. Т.к. акцент хотел сделать именно на том, на какой разряд смотреть. На первый их отброшенных. Ну т.е. все как ты и сказал. И почему тогда по-твоему 0.0347 при округлении до сотых должно стать 0.04?
29 NcSteel
 
28.10.16
23:46
(13) ты удивляешь... а почему должен 0.04?
30 Cyberhawk
 
28.10.16
23:47
+(28) или ты про то, что округление нужно начинать с самой последней цифры по цепочке? Впервые слышу...
31 Лефмихалыч
 
28.10.16
23:47
(30) меня так учили. Я всю жизнь так делаю.
32 NcSteel
 
28.10.16
23:48
(19) А почему должно так? 1С округляет по правилам математики, а не Экселя...

Новое в программирование, а именно "Правило Экселя".
33 Лефмихалыч
 
28.10.16
23:48
Я  - человек простой, округляю брутфорсом, с последней цифры
34 Cyberhawk
 
28.10.16
23:50
(31) Ну ты же понимаешь, что это будет менее точный результат: у тебя в отброшенных как бы 47 из ста, на численное превосходство (перевешивание) это не тянет... Представь хотя бы качельку, где с одной стороны 53, с другой - 47...
35 PR
 
28.10.16
23:50
Мдааа, даже сказать нечего. И эти люди автоматизируют страну.
36 Cyberhawk
 
28.10.16
23:51
(35) А ты качельку 53 -- 47 уже представил? :о)
37 Лефмихалыч
 
28.10.16
23:52
(34) да, мне всегда было непонятно такое ощутимое влияние этих мелких чисел на конечный результат, но усомниться как-то в голову не приходило. Тем более, что не так уж часто это нафиг надо было в жизни.

(35) нечего сказать - закрой рот и иди
38 Cyberhawk
 
28.10.16
23:52
53__________47
--     ^    --
39 PR
 
28.10.16
23:53
Не могут число округлить, в Эксель подсматривают, да еще _не_ понимают, почему так округляет!
40 Cyberhawk
 
28.10.16
23:54
(39) А почему Эксель так округляет, есть идеи кроме (26)? Это ж дичь...
41 Лефмихалыч
 
28.10.16
23:55
(40) потому, что он округляет брутфорсом - с самого конца
42 PR
 
28.10.16
23:56
(40) Как так?
43 PR
 
28.10.16
23:58
+(42) 0,035 до 0.04, если два знака? Или что?
44 Cyberhawk
 
29.10.16
00:00
(43) Щас Эксель открою, а то тут проверять за товарищами надо ))
45 Aleksey
 
29.10.16
00:02
(31) https://ru.wikipedia.org/wiki/Округление
О каком из методов идёт речь? Судя по твоему описанию у тебя какой то свой метод
46 Cyberhawk
 
29.10.16
00:03
Все эксель нормально округляет:

ROUND(0,0347;2) = 0.03
ROUNDUP(0,0347;2) = 0.04 и для ясности, что за ROUNDUP:
ROUNDUP(0,0301;2) = 0.04 (т.е. последний оставляемый разряд всегда повышает на 1, если после него что-то еще есть)
47 Cyberhawk
 
29.10.16
00:04
Короче автор использовал ОКРУГЛВВЕРХ в Экселе и почему-то посчитал, что в 1С должно быть так же
48 Cyberhawk
 
29.10.16
00:05
Блин, в (11) уже все разжевали
49 Cyberhawk
 
29.10.16
00:05
В (12) пример привели
50 PR
 
29.10.16
00:06
(46) Округли 0.035, будет 0.04, потому что https://support.office.com/ru-ru/article/Округление-числа-ba199237-27f0-4bc1-8185-5c2cdb4b45f6
"Округление числа 1,25 до одного знака после запятой. Поскольку округляемая часть — 0,05 или больше, число округляется вверх (результат: 1,3)".
Все нормально, просто Excel выбрал округление половины вверх.
С таким же успехом мог бы выбрать вниз.
Стакан наполовину полон. Или пуст. Для кого как.
51 PR
 
29.10.16
00:08
(11) А я рассчитывал, что команда в 1С "Заказать пиццу" через секунду дает звонок курьера в дверь и че?
52 Cyberhawk
 
29.10.16
00:10
(50) Мы не про Окр15как20 или как10 тут говорили, с 0.035 вопросов как раз не было. Вопросы были про (26), но это не подтвердилось
53 Cyberhawk
 
29.10.16
00:11
(41) Не, смотри последний пример в (46). Так что с конца последовательно никто цепь округлений не делает :)
54 Adilgeriy
 
29.10.16
01:13
окр(Окр(Окр(0,03472,4),3),2) = 0.04
55 bse
 
29.10.16
10:18
(10)  наверное потому что этот параметр касается только *.5 и все что меньше его обрабатываются обычными правилами округления.
56 bse
 
29.10.16
10:21
(55) блин... mista reader слоупок...
57 ivan-china-bk
 
29.10.16
11:23
Капец, инженеры знаний.
В какой школе вас учили?

http://dic.academic.ru/dic.nsf/ruwiki/103905
...
Во всех вариантах в случае, когда (N+1)-й знак не равен 5 или последующие знаки не равны нулю, округление происходит по обычным правилам: 2,49 ? 2; 2,51 ? 3.


.То касается, что ексель чего-то там насчитал: то одно время ексель в формуле 2 + 2 * 2 выдавал результат 8

через много лет они это пофиксили, но сути это не меняет.
58 ivan-china-bk
 
29.10.16
11:24
(57)  И да - миста такое го...но, что даже копипаст нормально вставить не может.
59 orefkov
 
29.10.16
11:24
Как ни крути, но вообще-то  0.03472 ближе к 0.03, чем к 0.04
Так что думающие, что правильное округление до 0.04 - форменные идиоты.
60 s_newbi
 
29.10.16
11:48
Норм пятничный топик
Учитель математики ТС походу икает
61 Jump
 
29.10.16
11:52
Вроде все умные люди, но бывают темы которые показывают сколько тут альтернативно умного народу.
62 Гость из Мариуполя
 
гуру
29.10.16
12:36
а можно переформулировать вопрос в сабже:
<<Как в 1С округлить число 0.03472 как 0.04>>
поясню:

в  Excel есть ДВЕ функции
- ROUND(
- ROUNDUP(
насчет первой все понятно - аналог в 1С имеется.
насчет второй - нет.

зы: округление всегда вверх - достаточно востребованная в бухгалтерии операция.
Например, при выписке меню-требования, например, в детском садике. Тот же молотый перчик, лавровый лист, да даже те же яйца, да любой продукт.
Недодача продуктов со склада на кухню чревата.
Коронная фраза "в зоопарке тигру недокладывают мяса" в интерпретации "в детсаду детям недокладывают сливочного масла" :)
для контролирующих органов как красная тряпка.
63 orefkov
 
29.10.16
12:39
(62)
Для округления вверх надо сначала просто прибавить половину следующего разряда. Например, при округлении до сотых прибавить 5 тысячных.
Окр(0.03472 + 0.005, 2)
64 dmpl
 
29.10.16
12:46
(33) Интересно, как по такому правилу надо округлять число пи и прочие иррациональные числа? У них количество знаков бесконечно.
65 Гость из Мариуполя
 
гуру
29.10.16
12:48
(59) <<думающие, что правильное округление до 0.04 - форменные идиоты.>>
ну-ну.. не надо так категорично :)
посмотрел бы я, кто выглядел бы форменным идиотом после проверки контрольно-счетной палатой в детсаду.
Тот, кто округляет по правилам математики (и обворовывает детей, а это именно ТАК назовут в акте проверки),
или тот, кто выдает продуктов детям полностью и пусть и чуть с излишком.
:)


(63) Да это то понятно. И в общем случае для произвольного разряда придется написать свою функцию.
Просто  сама констатация факта, что в 1С изначально такой в общем то нужной функции нет. А как реализовать - это уже чисто технический вопрос.

ps: Бухгалтерия - это не триумф математики над разумом,
Бухгалтерия - это триумф разума над математикой.
66 dmpl
 
29.10.16
12:52
(65) В обоих случаях будет наказание. В одном случае за обворовывание, в другом - за нецелевое расходование средств ;)
67 Гость из Мариуполя
 
гуру
29.10.16
13:06
(66) во  втором случае как правило ничего не будет.
Ибо это прописано в нормативах. Округлять ВСЕГДА вверх до
разрешающей способности (с учетом погрешности) весов (например лист лавровый).
Или до целых штук (например яйца).
Или до единицы упаковки (например молоко, сок).

Нецелевое расходование - это вообще не из этой темы. Это расходование на другие цели. Например, вместо продуктов купили игрушки :)
Здесь же максимум - неэффективное расходование. И то с натяжкой.
68 MrStomak
 
29.10.16
13:38
Читаю ветку с шевелящимися волосами - как такое возможно? Где вообще элементарное школьное образование? Что дальше? Будет топик с упомянутым примером 2+2*2 и про арифметические ошибки 1с?
69 Гость из Мариуполя
 
гуру
29.10.16
14:57
(68) тю.
дано:
- в группе имеется 11 детей.
- каждому ребенку положено на полдник (на ужин) 200 гр сока (молока).
-  имеется сок (молоко) в тетраупаковках по 500 гр

Вопрос - "сколько вешать в граммах" (с)?
Сколько сока (молока) в  граммах (и в упаковках) должен списать бухгалтер, если вскрытую упаковку сока (молока) по санитарным нормам запрещается давать детям позднее 12 часов после вскрытия.

ps: Иными словами, в примере 4.4  округлится до 5.  Что, волосы все так же шевелятся?  :)

Бухгалтерия это не математика.
1С - это не Mathcad.
70 MrStomak
 
29.10.16
15:23
(69) Да надоел ты уже с детьми своими.
Я автоматизировал кейтеринговую компанию, я знаю, когда нужно округлять 0.0300000001 как 0.04. Но это не округление, это приведение к другим единицам измерения.
Я не понимаю, как можно думать, что 0.0347 ближе к 0.04, чем к 0.03.
71 orefkov
 
29.10.16
15:30
(65)
Ну, вообще-то это не округление тогда называется. В других языках имеется вообще три функции - round, floor, ceil.
72 Aleksey
 
29.10.16
16:19
(69) Элементарно. Берем 10 пакетов молока, разливаем по стаканам (по 181 грамм), добавляем воды до 200 грам и 1 пакет (одинадцатый) забираем к себе домой. изи.
73 Дарлок
 
29.10.16
16:21
Я смотрю, что на югах своя математика )) рыночная
74 ivan-china-bk
 
29.10.16
16:35
Надо было автору сразу дать ссылку с понятным и простым для его уровня описанием
http://math-prosto.ru/?page=pages/rounding/rounding1.php
75 ivan-china-bk
 
29.10.16
16:36
И некоторым товарищам тоже стоит (74) перечитать разок-другой (или прочитать это первый раз в жизни - никогда ведь не поздно).
76 pavig
 
29.10.16
16:43
(61) Умело шифруются)
77 kuzyara
 
29.10.16
16:52
в 1С вообще весело с округлением: 10/3*3 != 10
78 kuzyara
 
29.10.16
16:55
Солидарен с (69)

Бухгалтерия - это не математика.
79 Aleksey
 
29.10.16
17:09
(77) Это в каком случае? Если каждый раз округлять результат?
80 kuzyara
 
29.10.16
17:15
(79) А ты набери в отладчике
81 MrStomak
 
29.10.16
17:24
(77) И что тут странного? Это следствие машинных вычислений, она не может сохранить в памяти результат 3.(3). 1с тут не при чем.
82 MrStomak
 
29.10.16
17:29
(79) то есть ты не в курсе, что в нужно сначала умножать, а потом делить?
83 dmpl
 
29.10.16
17:34
(82) О, очередные откровения пошли...
84 MrStomak
 
29.10.16
17:37
(83)
Для тебя - возможно.
Абсолютно бесплатное, причем.
85 Дарлок
 
29.10.16
17:38
(82) Надеюсь, это была шутка?
любой инжереный калькулятор при последовательном вычислении 10/3*3 дает 10. Это нормально.
кто не верит запускает в винде calc и пробует
86 kuzyara
 
29.10.16
17:40
(81) назови мне хоть один скриптовый язык, который не умеет периодические дроби, кроме 1С?
87 MrStomak
 
29.10.16
17:41
(85) Инженерный калькулятор реагирует на формулу и сам переставляет.
Программируешь ты не на инженерном калькуляторе.
Запусти sql managment studio и сделай select 10/3*3
88 MrStomak
 
29.10.16
17:44
(86) T-SQL, PL/SQL?
89 Adilgeriy
 
29.10.16
17:46
ЧтоОкгуляем = 0.0347
ЗнаковПослеЗапятой = 2
pow(основание, степень);
?(окр(ЧтоОкгуляем,ЗнаковПослеЗапятой)=ЧтоОкгуляем, ЧтоОкгуляем, окр(ЧтоОкгуляем,ЗнаковПослеЗапятой)+1/pow(10,ЗнаковПослеЗапятой))
под рукой программы нет что бы проверить но это Оркгулвверх(ЧтоОкгуляем , ЗнаковПослеЗапятой ) из Excel вынеси её в фнукцию и пользуйся
90 Aleksey
 
29.10.16
17:47
(80) Набирал, получилось 10.
91 Дарлок
 
29.10.16
17:51
(87) ты случайно родом не с юга?
92 Adilgeriy
 
29.10.16
17:51
(89) вру не совсем аналог на отрицательное значение ЗнаковПослеЗапятой не проверял скорее всего будет считать не правильно
93 Aleksey
 
29.10.16
17:52
(84) Для меня тоже это откровение, ибо уможение и деление равнозначные операции


P.S. Чему вас в школе учат? Один округляет с конца, другой сначало умножает потом делит



В школе дается следующее правило, определяющее порядок выполнения действий в выражениях без скобок:

- действия выполняются по порядку слева направо,
- причем сначала выполняется умножение и деление, а затем – сложение и вычитание.
(с) http://www.cleverstudents.ru/expressions/order_of_operations.html
94 Aleksey
 
29.10.16
17:54
(87) Какая формула? Действие без скобок выполняется слева направао
95 Дарлок
 
29.10.16
17:56
(94) человек просто никогда не изучал математику чисел с плавающей запятой, вот ерунду и придумал. Но он же 1С-ик, чего с него взять?
96 Либерал
 
29.10.16
18:05
ну вот, дожил - программисты(!) на сто постов спорят как округляются числа, за то церкви на каждом углу
97 Дарлок
 
29.10.16
18:09
(96) 1с-ики не программисты
98 kuzyara
 
29.10.16
18:11
(97) программист 1С - оксюморон (с)
99 MrStomak
 
29.10.16
18:26
(93) Речь не про математику, речь про вычисления с помощью процессора. В 1с нужно сначала умножать, а потом делить. Потому что не каждый результат деления может быть сохранен в памяти без отбасывания не вместившихся разрядов. Пример тебе уже писали.
(91) ты уже сделал запрос в sql select 10/3*3, мудрый северянин? будешь бороться за математические принципы до последнего и принципиально верить в отсутствие для программы разницы в порядке вычислительных операций?
100 Дарлок
 
29.10.16
18:33
(99) молодец. Ты смог поставить на свою домашнюю машину sql server. Возьми с полки пирожок, ведь ты настоящий 1с-ик.
Зы. Все таки с юга ))
101 Aleksey
 
29.10.16
18:38
(99) ?? На основание каких математических правил нужно сначала умножать, потом делить? Ты где в 5 классе учился? Или сразу с детского сада в 1Сники пошел?
102 Aleksey
 
29.10.16
18:42
10/3*3 скобок нет, операции умножения и деления равнозначемые, значит сначала нужно 10/3 получим 3,3(3) (в скобках 3 означает что 3 в периоде, так обычно в школе учат записывать), а потом полученный результат умножаем на 3, получаем 10.

Если конечно округлять до 2 знака, то получим
10/3 = 3,33
3,33*3 = 9,99

Может на твоем калькуляторе стоит округление? (есть у некоторых такая функция, когда он сам округляет)
103 Дарлок
 
29.10.16
18:44
(101) на основании практики. Лучше сначала умножить, а потом поделить. Для увеличении точности вообще можно предварительно умножить допустим на 10 000, но утверждать, что процессор сначала умножает на 10 000 затем еще раз умножает, затем делит и еще раз делит на 10 000 может только 1с-ик с юга ))
(102) ессно стоит и  используется математика с плавающей точкой. Такая фигня есть на всех современных калькуляторах инжереных, а вот бухаглтерские калькуляторы используют обычную математику, там будет 9,9
104 Aleksey
 
29.10.16
18:45
И по поводу SQL, учись правильно приводить к типам. У тебя тип int, т.е. целое, а значит результат вычислений будет целое число, т.е. на для скуле это означает

10/3 = 3,3333, но так как результат у нас целое число значит
10/3 = 3
Потом умножение
3*3 = 9

Т.е. округление тут вообще непричем, причем тут только тип числа
105 Aleksey
 
29.10.16
18:45
(103) Мало ли кому что лучше, есть правила математики, и по ним счетается
106 Дарлок
 
29.10.16
18:47
(105) и то этой фигней с перестановкой операций приходися заниматься из за отсутсвия нормальных типов данных . К математике это никакого отношения не имеет.
107 MrStomak
 
29.10.16
19:35
(100) Так понимаю, что обычно эти виляния задницей вместо ответа на конкретный вопрос, работают.
Ок.

Молодец. Ты смог поставить на домашнюю машину windows с сalc. Возьми с полки пирожок, ведь ты настоящий программист, а не тупой 1сник.
108 MrStomak
 
29.10.16
19:43
(105) Да как бы считай как хочешь. Просто в одном случае у тебя будеь 9.99, в другом 10. Когда из-за этого пойдут косяки, говори что тупая 1с виновата
109 MrStomak
 
29.10.16
19:50
(102) Компьютер не может запомнить число 3,(3). У него есть конкретная выделенная память под переменную. Он вынужденно обрежет невлезшие разряды и ты получишь погрешность. Или ему нужно будет хранить не результат, а операнды - числитель и знаменатель
110 dmpl
 
29.10.16
19:57
(99) В Си как раз порядок четко определен - как в математике, слева навраво, никаких переставлений. Как программист пишет - так и должно быть посчитано. И в стандарте так прописано именно чтобы разные реализации давали один и тот же результат.

(109) А теперь вопрос: отчего погрешность будет больше: от умножения и, как следствие, потери точности из-за не влезших разрядов или от деления и того же следствия. Затем объясни, почему именно умножением лучше терять точность, чем делением.
111 ivan-china-bk
 
29.10.16
21:31
(96) 1С - это, к сожалению, парапрограммисты. Но все равно обидно, что в школе все не умеют учиться.
112 MrStomak
 
30.10.16
09:51
(110) Потому что после умножения у тебя всегда будет конечное число разрядов, а после деления - не всегда.
Твой капитан.
113 MrStomak
 
30.10.16
09:55
(104)
Да какие проблемы - приводи типы, чего мне то эти рекомендации? Сделай select cast(10 as numeric (20,17))/3*3
114 dmpl
 
30.10.16
10:15
(112) Какая разница, если этих разрядов в том же float кот наплакал? И, например, 30 000 001 там невозможно записать в принципе - только 30 000 002 или 30 000 000. Да и в double не сильно лучше - перемножаешь пару чисел чуть точнее float - и уже теряешь точность.
115 MrStomak
 
30.10.16
10:28
(114)
Вот ты философски подходишь - а какая разница, если в любом случае можно выйти за границы выделенной памяти?

Но пример с 10/3*3 это ежедневная убийственная практика. Как программист, ты можешь ограничивать разрядность используемых операндов и четко контролировать - сколько максимально потребуется после операции умножения. Дробная часть при этом очень редко когда требуется больше 3. У тебя есть возможность написать алгоритм так, что он будет работать без ошибок.

В случае с делением ты никогда заранее не сможешь соломку подстелить.

10/3*3 постоянно возникает при распределении по базе. Надежный алгоритм распределения по базе будет содержать строчку ОсталосьРаспределить*ТекущееЗначениеБазы/ОсталосьБазы. Если поменять местами умножение и деление - постоянно будет то здесь то там возникать 9.999999999 и это будет генерировать просто кучу проблем.
116 nordbox
 
30.10.16
10:45
а ты попробуй число Пи  округли )))
117 wertyu
 
30.10.16
11:00
пятница шла третий день )
118 zak555
 
30.10.16
12:27
(11) > Я рассчитывал что в 1с Окр(;2) = ОКРУГЛВВЕРХ(;2) в екселе.


это разные функции
119 Chameleon1980
 
30.10.16
12:56
жутко интересно
120 dmpl
 
30.10.16
13:09
(115) Дык вот в том-то и дело, в _В КОНКРЕТНОМ_ случае лучше сначала умножить. А если это какие-то другие вычисления, то там все далеко не так просто. Поэтому утверждение из (82) в общем случае (как оно было там выдано) неверно.
121 MrStomak
 
30.10.16
13:39
(120)
Я вижу какие-то проблемы с формальной логикой.

1. Есть операция деления, которая выдает не влезающий в разрядность результат регулярно и независимо от разрядности операндов.

2. Есть операция умножения, которая выдает не влезающий в разрядность результат только в том случае, если сумма разрядностей операндов не поместится в отведенные для числа 38 разрядов.

Ты называешь случай из п.1 частным, а из п.2 - общим.

А на самом деле всё наоборот. Случай, когда у тебя после перемножения будет число больше 99 999 999 999 999 999 999 999 999 999 999 (минус разряды на дробную часть) - частный и предсказуемый (ты же знаешь максимальную разрядность операндов!), а вот то, что в любой момент деление может выдать результат, который не уместиться НИ В КАКУЮ разрядность - общий.

Сначала_умножать_потом_делить
122 MrStomak
 
30.10.16
13:46
(114) Блин, если ты говоришь про double и float то это вообще теряет смысл.
Эти типы не хранят точных значений и допускают погрешность по своей природе.
В отношении данных типов нет смысла в переставлении операций - погрешность будет всегда.

Я говорю про работу с типами, которые используются в финансовых программах, т.е. БЕЗ плавающей точки. decimal, numeric - по разному могут называться, нативного Си-шного типа для этих целей нет.
123 dmpl
 
30.10.16
19:26
(121) Общий случай: есть числа с мантиссой x знаков, все разряды которой используются. И что при умножении, что при делении таких чисел будет потеря точности. Случай, когда используются не все разряды - частный.

(122) В финансовых программах все еще печальнее, ибо при фиксированной запятой результат умножения может просто не поместиться в переменную и округлиться до максимального влезающего в нее числа. Тут не то что последний разряд может на единичку измениться - тут в разы неправильный результат может быть. И опять правило не работает.
124 MrStomak
 
30.10.16
19:52
(123) Мне сколько раз тебе повторять надо, что количество разрядов после умножения - известная величина?
Условно, в 1с принято использовать Число(15.2) Перемножая два таких числа, я точно знаю, что у него будет не более 34 разрядов при имеющемся ограничении в 38. Проблема возникнуть не может в принципе.
125 Mauser
 
30.10.16
20:06
(121) Простите, что вмешиваюсь, а вот если множитель меньше единицы, ну так вот получилось при вычислении переменной, что тоже надо сначала делить, еще раз извините?
126 Torquader
 
30.10.16
20:10
(125) Ситуации, когда нужно решать с выбором порядка стандартных операции - обычно описаны в численных методах, и там есть объяснение каждого случая.

В 1С никто не считает с 17 и более знаками после запятой, а все денежные величины считаются в минимальной денежной единице.

Что касается округления, то есть системы где не только округляется вниз всё, что меньше 0.5 и вверх всё, что больше, но и 0.5 округляется вверх или вниз исходя из чётности или нечётности цифры в младшем разряде единиц - чтобы была симметрия.
127 dmpl
 
30.10.16
20:15
(124) Это и есть частный случай. Бери числа из 38 знаков - и перемножай. Общий случай на то и общий, что нет никаких оговорок. Правило для общего случая должно работать ВСЕГДА, вне зависимости от типов чисел и их значений. Как только ты вводишь оговорки - это становится частным случаем.
128 MrStomak
 
30.10.16
20:59
(125) Сначала надо не делить, а умножать.
меньше или больше единицы при этом операнд - без разницы.

(127)
Дружище.
Когда говорят "В общем случае следует..." - то это не означает, что высказывание применяется для 100% вариантов.
Поэтому то, что ты приводишь какой-то запредельный вариант, когда это не соблюдается - это ничего не меняет. Если, конечно, ты не хочешь сказать, что в общем случае программисту приходится работать с числами в 38 разрядов.

Чего ты хочешь добиться этими заигрываниями с терминологией - я не пойму.

Любой вменяемый 1с-ник должен сначала умножать, а потом делить. Потому что с 38разрядными величинами в 1С работать нет необходимости, а ошибки в копейки лезут отовсюду.

Я тебя не заставляю так делать - дели себе на здоровье, потом лови ошибки с этих "частных случаев". Объяснять в 5й раз тоже самое смысла вообще не вижу - все равно же покривляешься, а сам в следующий раз будешь прописывать умножение сначала - на всякий случай.
129 Повелитель
 
31.10.16
07:29
(0) 0.03 правильно. Автор профан.
130 Pahomich
 
31.10.16
07:46
10/3*3  тем ближе к 10, чем выше разрядность после запятой вычислительной техники. Интересно, какая разрядность мозга, если он дает точно 10?
131 ДемонМаксвелла
 
31.10.16
08:18
(130) очевидно, что никакая. Он аналоговый, а не цифровой.
132 _KaA
 
31.10.16
08:39
(0)

И ты же еще 1С небось зарабатывать пробуешь... денег за это берешь ...
133 butterbean
 
31.10.16
08:40
(130) мозг кроме арифметики при решении подключает еще и логику, если бы он считал как компьютер человек при вычислении завис бы очень надолго
134 Pahomich
 
31.10.16
08:44
(131,133) Ваши предположения забавны...
135 33554432
 
31.10.16
09:00
Офигеть просто. Раз уж тут столько экспертов, может заодно подскажете, почему функция Цел(1) возвращает 1?
136 Дарлок
 
31.10.16
09:14
(135) очевидно, что он сначала умножает на ноль, а затем делит. (цы) математики с юга России
137 ДемонМаксвелла
 
31.10.16
09:21
(134) чего смешного то? Ты, видимо, имеешь в виду, что мозг человека считает с бесконечной точностью, да?

Давай мне корень квадратный  из числа пи вычисли в уме. Меня устроит первая тысяча знаков, не надо все.
138 newbling
 
31.10.16
09:45
> округление нужно начинать с самой последней цифры по цепочке

wat
139 Джо-джо
 
31.10.16
09:50
с какой цифры не начинай, а 1,47 всё равно меньше 1,5.
140 newbling
 
31.10.16
10:11
Какое-то деревянное округление.
141 MrStomak
 
31.10.16
10:20
(136)
В том ВУЗе, где ты купил диплом, должны были тебе хотя бы намекнуть, что указанное выражение вернет не 1, а неопределенность, дабы ты вот так вот не позорился на форуме.

Хотя со скоростью твоего переобувания от (85) до (103), не сомневаюсь, что ты сейчас опять развернёшь свое высказывание.

Приступай.
142 Homer
 
31.10.16
10:25
Я честно говоря в а*уе от простейшего вопроса. Кто все эти люди))
143 Дарлок
 
31.10.16
10:29
(141) у тебя не только с логикой плохо, но и с ЧЮ =)
144 MrStomak
 
31.10.16
10:36
(143) Съехал на "Это я всё шутил", засчитано. Не подвёл, молодец!
145 Дарлок
 
31.10.16
10:42
(144) в отличии от тебя я !знаю!, как должен работать компилятор - это регулируется стандартами, и я !умею! работать с учетными системами, а в частности типами, где малое число знаков после запятой и как добиваться при этих ограничениях приемлемой точности.
А самое главное, понимаю где начинается одно и заканчивается другое и в чем разница.

ЗЫ. Было бы забавно, когда ты хочешь поделить, а тебе компилятор вместо это делит... вот жизнь бы, раем не казалась
и да, проведи эксперемент. Возьми калькулятор, подели 10 на 3, сохрани полученное значение в Memory, затем очисти .. извлеки из памяти число и умножь на 3 и удивись... Или возьми хардкорный инженерный калькулятор (на винде не получится), затем подели 10 на 3 и умножай на 1000, пока последний знак не станет отличаться от 3. Я это проделывал, когда мне было лет 8-9, потому что было интересно, а что выйдет.
146 MrStomak
 
31.10.16
10:53
(145)
А вот эти вот видения, в которых ты увидел мои рассуждения о работе компилятора - они часто приходят? Не пора ли обратиться  с ними к соответствующему врачу?

Я не заявлялся на знатока работы инженерных калькуляторов. Я не знаю, про что ты и как оно написано. Я отталкивался от предпосылки, что раз он "инженерный", то он, возможно, не должен использовать вещественные типы, дабы не возвращать полную фигню в ряде случаев.
Единственный приходящий мне на ум вариант с сохранением точности - отталкиваться от целочисленных типов, храня иррациональные значения в виде дроби - ровно так, как мы записываем это в математике.

Такая запись сложнее, там по сути не будет записано конечного значения, арифметические операции с таким "типом" будут выполняться дольше - но ведь инженерный калькулятор не должен хвастаться бешеной скоростью операций? Техническая реализация такого типа в ЯП будет в конечном итоге перестановкий операций - потому что если храним число в виде числителя и знаменателя, значит откладываем деление на потом.

Но ты, очевидно, рассуждаешь про вещественные типы и предлагаешь их использовать в программах, которые считают деньги. Тем самым, ты наглядно демонстрируешь свою профнепригодность - очень хорошо, что 1С при проектировке примитивных типов в платформе убрали от твоих шаловливых рук такую возможность, чтобы ты мог на форуме поныть "приходится переставлять, так как нет правильных типов".
147 Дарлок
 
31.10.16
10:57
(146) слив засчитан...
прежде чем писать свое "особо важное мнение" надо было почитать ветку и подумать нужно ли оно здесь.

>>Единственный приходящий мне на ум вариант с сохранением точности
с этим тебе только в секту, причем в любую.
148 MrStomak
 
31.10.16
11:09
(147)
Когда не можешь возразить аргументом - напиши как можно быстрее "Слив засчитан" - будь крутым пацаном, епт!

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

P.S. Судя по отсутствию комментариев про вещественные типы, очевидно, я угадал. Порой, в качестве аттача к сообщению, хочется приложить фотку Лаврова.
149 bodri
 
31.10.16
11:23
(0) советую почитать учебник математики за 5-й (если не ошибаюсь) класс
150 Дарлок
 
31.10.16
11:35
(148) человек пришел с домыслами, и считает, что ему обязаны возражать аргументами?
вот уж воистину "один дурак напишет столько вопросов, что и 100 мудрецов не ответят"...
на женщину судя по фото ты не похож, гуманитарий не лез бы с особо ценным мнением, ибо их первым делом учат, что их мнение абсолютно никому не интересно..., а вот южные наши браться всегда отличались особым подходам к торговле и математике =), а самое главное вольной её трактовкой.
151 MrStomak
 
31.10.16
11:49
(150)
Да, в дискуссии обычно используют аргументы.
Даже домысел отвечают аргументами - так, мол и так, данное утверждение неверно.
Ну это не в твоей деревне, конечно, извини что заподозрил в тебе способность вести дискуссии.

Ты на утверждение, что сначала нужно умножать, а потом делить, сначала ответил полным недоумением, а через полчаса, продемонстрировав способности Ртути, уже ответственно пишешь - "Да, так и надо, я всё знаю". Согласен с тем, что ждать от такого умельца дискуссии излишне самонадеянно.

Судя по твоей фиксации на юге, ты, видимо, оттуда. Ну или кто-то из южных братьев нанес тебе тяжелую психологическую травму.

Ты должен принять это и жизнь дальше, дружище, не фиксируйся так. Того, что произошло, в любом случае не изменишь. Попробуй полюбившийся с детства метод релаксации - открой инженерный калькулятор и повбивай циферки. Главное, не ставь на своём компе каких-либо средств программирования - мир и без твоих программ гадкое место.
152 Pahomich
 
31.10.16
11:51
(137) Это услуга платная...
153 Дарлок
 
31.10.16
13:48
(151) чувак... ты через чур зациклен на себе и с тобой никто дискуссию вести изначально не собирался. Чисто поржать над еще 1С-специалистом и ничего личного.
154 MrStomak
 
31.10.16
14:14
(153)
А, понятно.
Переживаешь по поводу сертификата.
Ты не сдавайся, работай над собой, и у тебя обязательно все получится.
155 newbling
 
31.10.16
14:20
Кстати, напомнило логику моего школьного учителя информатики - где он долго-долго описывал какой-то алгоритм и его прелести относительно более простого алгоритма и что он должен быть в 3 раза быстрее, а на машинах у всех получалось в районе 1.3 или 1.4 раза быстрее.

На наш закономерный вопрос "а где же 3" он сказал: "1.3 очень близко к 1.5. 1.5 округляется до 2, а от 2 до 3 рукой подать".
156 aleks_default
 
31.10.16
14:44
(154) кстати, почему SQL результат деления с числом в периоде после запятой обрезает до 6 знаков, а не до 28 или хотя бы до 10(как в 1с)?
157 Катя2504
 
31.10.16
15:04
Иногда от чтения тем на мисте волосы встают дыбом...
158 Дарлок
 
31.10.16
15:18
(154) у меня их поболее, чем у тебя... только, что старее. Да и убрал я их подальше с глаз, когда был помладше тебя
(157) они друг друга понять не могут, как они у пользователей требования собирают и что из этого выходит, можно увидеть после каждого релиза 1С ;)
159 MrStomak
 
31.10.16
15:24
(156)
Это описанное в документации поведение:
https://technet.microsoft.com/en-us/library/ms190476.aspx

max(6, s1 + p2 + 1)
160 Дарлок
 
31.10.16
15:28
(154) ан-нет пересчитал, был не прав. одинаково =) а вот у жены моей поболее будет. ;)
можем их вместо сложить в костер... пламя знатное получится.
161 aleks_default
 
31.10.16
15:29
(159)Т.е. настройки скуля тут нипричем? Спасибо.
162 MrStomak
 
31.10.16
15:32
(160) Старенький уже, а все сертификатики там высчитываешь, жену там зачем-то притащил. Угомонился бы уже - никому твои профы по бух 7.7 неинтересны.
163 Дарлок
 
31.10.16
15:34
(162) профы мусор, чего их считать, то =)
164 Злопчинский
 
31.10.16
17:55
(151) для релаксации еще весьма способствует наблюдение за процессом дефрагментации когда квадратики бегают!
165 newbling
 
31.10.16
17:57
(164) Да, наглядно видна кропотливая работа, которая из хаоса строит подобие порядка.