Имя: Пароль:
1C
 
Округление до Сотен, Тысяч
0 Zlodey1С
 
09.12.08
12:23
Есть какая нибудь приблада для округления числа до сотен или тысяч. Допустим число 86 округляем до 100, 869 до 1000, 1260 до 2000, 15684 до 16000 и т.д
1 Zlodey1С
 
09.12.08
12:24
Если самому писать то думаю только через длину числа и на сравнение последнего символа на 0.
2 Euguln
 
09.12.08
12:24
Встроенные функции языка
Окр (Round)
Синтаксис:
Окр(<Число>, <Разрядность>, <Режим округления>)
Параметры:
<Число> (обязательный)
Тип: Число. Исходное число.
<Разрядность> (необязательный)
Тип: Число. Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <Режим округления>.
Значение по умолчанию: 0
3 Immortal
 
09.12.08
12:26
нипаверишь,)
Число = Окр(86145,-3);    
Сообщить(Число);
4 Zlodey1С
 
09.12.08
12:26
(2) Внимательно читаем "Определяет число знаков дробной части"
5 Zlodey1С
 
09.12.08
12:26
(3) Счаз проверю
6 wPa
 
09.12.08
12:27
(4) а умножить поделить )
7 zbv
 
09.12.08
12:27
(4) внимательно читаем "Если параметр отрицательный ..."
8 Sadovnikov
 
09.12.08
12:27
(4) Внимательно читаем: " Если параметр отрицательный, то число округляется до соответствующего разряда в целой части"
9 Zlodey1С
 
09.12.08
12:28
Тысяча чертей
10 Zlodey1С
 
09.12.08
12:29
Не то
11 Zlodey1С
 
09.12.08
12:29
Надо в большую сторону
12 wPa
 
09.12.08
12:30
(10) Раздели - возьми Цел - умножЪ
13 Zlodey1С
 
09.12.08
12:30
Блин туплю все вопрос снят
14 СоболиныйГлаз
 
09.12.08
12:30
А мне вот надо было округлять до ближайшего(обязательно сверху) целого. Такой функции или режима известных функций не нашел.
15 Fragster
 
гуру
09.12.08
12:31
(14) раз в неделю такая фигня.... Окр(Твое+0.4999999999)
16 Живой Ископаемый
 
09.12.08
12:33
(15) Наверное ЦЕЛ(Твое+0.5)
17 Живой Ископаемый
 
09.12.08
12:33
а, не... не пойдет
18 wPa
 
09.12.08
13:19
Число = 15684;
Разрядов = СтрДлина(СтрЗаменить(Строка(Число), Символы.НПП,""));
Разрядов = ?(Разрядов<2,2,Разрядов);
Разрядов = ?(Разрядов>3,3,Разрядов);
Делитель = Pow(10,Разрядов);
ЦелЧисло = Цел(Число/Делитель)+1;
Результат = ЦелЧисло * Делитель;
19 Fragster
 
гуру
09.12.08
13:21
(16) через Цел: Цел(Твое+0,9999999999999999)
20 Живой Ископаемый
 
09.12.08
13:26
2(19) Ну или так...
Или, чтобы не зависеть от количества девяток и точности дробной части в числе:
?(Цел(Твое)=Твое,Твое,Цел(Твое+1))
21 Serg_1960
 
09.12.08
13:28
Твое = Цел(Твое) + (Твое-Цел(Твое)>0.0);
22 Serg_1960
 
09.12.08
13:36
(21) +
// округление 0.5 в большую сторону:
Твое = Цел(Твое) + (Твое-Цел(Твое)>=0.5);

// округление 0.5 в меньшую сторону:
Твое = Цел(Твое) + (Твое-Цел(Твое)>0.5);
23 Fragster
 
гуру
09.12.08
13:40
(21,22) а как ты число и булево складываешь интересно...
24 Cheater
 
09.12.08
13:41
(14) а если число целое? например 13?
25 СоболиныйГлаз
 
09.12.08
13:44
(15):-) так я и написал нечто подобное, но таки такого режима округления в типовых функциях нет. Просто научись читать то, что пишет автор, а не то, что думаешь ты :-)
26 СоболиныйГлаз
 
09.12.08
13:49
(24)А если число целое, то 13=13 - т.е. никакого округления вверх. поэтому пример в (15) Окр(Твое+0.4999999999) скоропалителен и в общем случае неверен. А у меня именно общий случай и был :-) Т.е. количество необходимых девяток заранее неизвестно. Понятно, что и движок имеет определенную точность вычислений, но дела это не облегчало, поскольку были возможны ситуации типа 13,0...01.
27 Fragster
 
гуру
09.12.08
13:51
(26) а проверить? окр(13+0,499999999) = 13
28 Fragster
 
гуру
09.12.08
13:51
а девяток там лепить по желанию...
29 Fragster
 
гуру
09.12.08
13:52
(28)+ и по точности... в типовых больше 5 точности не видел, так что могу врать... ну да 9 девяток должно хватить полюбому, ибо 1с - не для научных расчетов используется :)
30 Cheater
 
09.12.08
13:55
(26) понятно
31 Serg_1960
 
09.12.08
13:58
(29) Мне бы вашу уверенность :)
Сообщить(13.1/13); // в окне будет выведено 1,007692307692307692307692307692307692
32 Serg_1960
 
09.12.08
14:10
(24) А проверить? А вот так убедительно звучит:
Твое = 13.00;
Твое = Цел(Твое) + (Твое-Цел(Твое)>0.0);
Сообщить(Твое); //"13"

Твое = 13.0000000000000000000000000000000000000000000000000000000000000000000000001;
Твое = Цел(Твое) + (Твое-Цел(Твое)>0.0);
Сообщить(Твое); //"14"
33 СоболиныйГлаз
 
09.12.08
14:21
(27)Я немного неправильно построил пост. То, что окр(13+0,499999999) = 13 я не сомневаюсь. Неверность в общем случае касалась именно количества девяток.
(28)Мое желание тут ни при чем. Просто разрядность заранее неизвестна и неизвестно, как тот или иной релиз движка будет отрабатывать ситуацию с очень большим числом девяток. Может получиться как с интеловскими процами в свое время, когда народ нарыл, что они из-за некоего упрощения или ошибки в алгоритме ошибаются на некие миллипизерные цифирьки.
34 Cheater
 
09.12.08
14:21
(32) я спрашивал надо ли 13 округлять до 14 )))
35 СоболиныйГлаз
 
09.12.08
14:22
Я использовал более корректный, но чуть-чуть более сложный алгоритм.
36 Живой Ископаемый
 
09.12.08
14:24
(33) Глянь 20 - работает...
37 СоболиныйГлаз
 
09.12.08
14:27
(36)А чего глядеть? Я примерно так и сделал :-) Только реализовал это в виде функции, сходной с Окр()
38 Fragster
 
гуру
09.12.08
14:28
(32) я всегда думал, что в булево - ложь - это 0, а истина - это не 0
39 Живой Ископаемый
 
09.12.08
14:29
(37)а, понел... :)
40 Fragster
 
гуру
09.12.08
14:29
(38)+ в смысле, оно не всегда равно 1, и по этому в (32) - некорректное использование
41 Serg_1960
 
09.12.08
14:30
(34) Дык, ведь в (14) спросили :) Я и рад стараться (32)
42 hhhh
 
09.12.08
14:31
(33) а зачем нам столько девяток. И ежу понятно, что для реальных случаев, вполне достаточно 2-х девяток, ну на крайний случай 3-х. Например, округление цен в большую сторону:

Окр(13.01 + 0.499) = 14.
43 Serg_1960
 
09.12.08
14:31
(40) А что не так?
Булево (Boolean)
Синтаксис:
Булево(<Значение>)
Параметры:
<Значение> (обязательный)
Тип: Число, Булево. Исходное значение.
Возвращаемое значение:
Тип: Булево. Полученное значение.
Описание:
Преобразует полученный параметр в значение типа Булево.
Преобразование числа к типу Булево производится по следующим правилам:
0 преобразуется в Ложь;
ОСТАЛЬНЫЕ ЗНАЧЕНИЯ преобразуются в Истина.
44 Fragster
 
гуру
09.12.08
14:34
(43) а про обратное преобразование
45 Fragster
 
гуру
09.12.08
14:34
(44) прочитал
46 hhhh
 
09.12.08
14:37
(43) здесь нигде не сказано, что ИСТИНА = 1. То есть в общем случае получается

Твое = Цел(Твое) + ОстальныеЗначения;
47 Serg_1960
 
09.12.08
14:41
Да, поверьте мне на слово :)

Если Твое Тогда
  Соообщить("Любое число - ИСТИНА");
Иначе
  Сообщить("и только 0 - ЛОЖЬ");
КонецЕсли;
48 Fragster
 
гуру
09.12.08
14:42
(46,47) в правилах преобразования к числу прочитал, что истина к единице преобразуется... в этом плане инетересо Число(Твое=Твое) всегда 1
49 Живой Ископаемый
 
09.12.08
14:43
Ну..
Цел(13.3)+((13.3-Цел(13.3))>0.0)=14, это я в табло проверил
Цел(13)+((13-Цел(13))>0.0) = 13

Единственное что - я бы скобок везде наставил.. а то можно с приоритетом не угадать...
50 Cheater
 
09.12.08
14:43
(41) я почему-то решил, что и 13 надо до 14 "округлять" (до ближайшего(обязательно сверху) целого). Я, наверное, один такой )))
51 Fragster
 
гуру
09.12.08
14:44
(50) ну тогда Цел(Твое)+1 канает
52 Живой Ископаемый
 
09.12.08
14:46
(50) тогда легче, никаких условий не надо...
53 Serg_1960
 
09.12.08
14:47
Шутки-шутками, но дело... 1С позволяет "управлять" округлением, но: в запросах ей "помогает" SQL :) - а у него другие "соображения" насчёт округлений :))
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший