Вход | Регистрация

  1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Почему 1с округляет число 0.03472 как 0.03

Почему 1с округляет число 0.03472 как 0.03
Я
   Nesh
 
28.10.16 - 22:10
Почему число 0.03472 1с округляет Окр(0.03472,2) как 0.03? Так задумано, или это общеизвестный баг (фича)?
 
 
   Aleksey
 
101 - 29.10.16 - 18:38
(99) ?? На основание каких математических правил нужно сначала умножать, потом делить? Ты где в 5 классе учился? Или сразу с детского сада в 1Сники пошел?
   Aleksey
 
102 - 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
   Aleksey
 
104 - 29.10.16 - 18:45
И по поводу SQL, учись правильно приводить к типам. У тебя тип int, т.е. целое, а значит результат вычислений будет целое число, т.е. на для скуле это означает

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На наш закономерный вопрос "а где же 3" он сказал: "1.3 очень близко к 1.5. 1.5 округляется до 2, а от 2 до 3 рукой подать".
   aleks_default
 
156 - 31.10.16 - 14:44
(154) кстати, почему SQL результат деления с числом в периоде после запятой обрезает до 6 знаков, а не до 28 или хотя бы до 10(как в 1с)?
   Катя2504
 
157 - 31.10.16 - 15:04
Иногда от чтения тем на мисте волосы встают дыбом...
   Дарлок
 
158 - 31.10.16 - 15:18
(154) у меня их поболее, чем у тебя... только, что старее. Да и убрал я их подальше с глаз, когда был помладше тебя
(157) они друг друга понять не могут, как они у пользователей требования собирают и что из этого выходит, можно увидеть после каждого релиза 1С ;)
   MrStomak
 
159 - 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) ан-нет пересчитал, был не прав. одинаково =) а вот у жены моей поболее будет. ;)
можем их вместо сложить в костер... пламя знатное получится.
   aleks_default
 
161 - 31.10.16 - 15:29
(159)Т.е. настройки скуля тут нипричем? Спасибо.
   MrStomak
 
162 - 31.10.16 - 15:32
(160) Старенький уже, а все сертификатики там высчитываешь, жену там зачем-то притащил. Угомонился бы уже - никому твои профы по бух 7.7 неинтересны.
   Дарлок
 
163 - 31.10.16 - 15:34
(162) профы мусор, чего их считать, то =)
   Злопчинский
 
164 - 31.10.16 - 17:55
(151) для релаксации еще весьма способствует наблюдение за процессом дефрагментации когда квадратики бегают!
   newbling
 
165 - 31.10.16 - 17:57
(164) Да, наглядно видна кропотливая работа, которая из хаоса строит подобие порядка.
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует