|
Странное поведение числа | ☑ | ||
---|---|---|---|---|
0
Бюро пиявок
13.10.13
✎
11:25
|
Что у нас происходит с числом?
Завел константу КК1. Сделал обработку, кинул в нее константу как реквизит BOK1. В модуле формы: &НаКлиенте Процедура Сформировать(Команда) Сообщать(); КонецПроцедуры &НаСервере Процедура Сообщать() А = 123456789012345678901234567890; Объект.ВОК1 = А; Константы.КК1.Установить(Объект.ВОК1); Сообщить("КК1 = " + Константы.КК1.Получить()); Сообщить("Объект.ВОК1 = "+ Объект.ВОК1); КонецПроцедуры Меняю точность КК1 и ВОК1, а также само число. Результаты здесь: http://yadi.sk/d/X1KVdSrJAqETZ Что творится на 7-ё строке - для меня загадка. И дальше одни сплошные загадки. Не могли бы помочь разобраться. По документации у нас число ограничено 38 разрядами. В свойствах объекта можно задать длину 32 и точность 32. Это как бы максимум. При этом переменной можно присвоить число, кажется, любой длины. Т.е. вот переменной А можно присвоить число длиной, скажем, 50 цифр. И оно будет болтаться в этой переменной прекрасно и без искажения. А вот с записью в базу у него возникают проблемы. Кстати, что такое число? Вот у меня на 15-й строке файла число или нет? Как бы работает, дк? А почему это число у меня начинается с нуля? В общем, число меня совсем погубило. Прошу помощи. |
|||
1
Rie
13.10.13
✎
11:35
|
(0) Так и в чём проблема-то?
Насчёт переменной - это тебе лишь кажется, что любой длины. |
|||
2
Бюро пиявок
13.10.13
✎
11:36
|
(1) Почему кажется. Ну, гигантских чисел я туду не помещал. Но 50 вмещается. И в отладчике видно все 50 будет.
|
|||
3
Бюро пиявок
13.10.13
✎
11:37
|
(1) Проблема в том, что не могу для себя ничего понять вообще. Откуда взялось 38, например, и как его можно практически применять?
|
|||
4
Rie
13.10.13
✎
11:40
|
(3) Из внутреннего представления чисел взялось. В SQL:
"p (точность) Максимальное количество десятичных разрядов числа (как слева, так и справа от десятичной запятой), которые будут храниться. Точность должна быть значением в диапазоне от 1 до максимум 38. Точность по умолчанию составляет 18" - http://msdn.microsoft.com/ru-ru/library/ms187746.aspx |
|||
5
Rie
13.10.13
✎
11:41
|
+(4) Просто прими как факт - это в теории числа идут аж до бесконечности. А на практике - всегда есть ограничения. Они могут быть большими, могут быть меньшими - но они будут. Их надо просто знать и учитывать.
|
|||
6
vde69
модератор
13.10.13
✎
11:42
|
база файловая???
|
|||
7
vde69
модератор
13.10.13
✎
11:43
|
(6)+ web клиент?
|
|||
8
Бюро пиявок
13.10.13
✎
11:44
|
(6) Файловый вариант, тонкий клиент.
|
|||
9
Бюро пиявок
13.10.13
✎
11:45
|
Так. А что такое 30? Почему при 30 начинает искажать значение?
|
|||
10
Бюро пиявок
13.10.13
✎
11:49
|
(4) Я вот про 38 все-таки понять не могу. Это общая длина числа? Т.е. если условно прикрыть десятичный разделитель, то максимально можно сохранить 38 цифр. Так? Или все-таки по 38 с каждой стороны от разделителя?
|
|||
11
vde69
модератор
13.10.13
✎
11:53
|
(8) в файловом варианте все вычисления идут на клиенте....
дальше возможны варианты типа v8: v8: получаю разное число (1коп) в web и тонком клиенте |
|||
12
Rie
13.10.13
✎
11:56
|
(10) Да. Общая. Написано ведь "как слева, так и справа от десятичной запятой".
|
|||
13
Бюро пиявок
13.10.13
✎
11:56
|
(11) Спасибо. Это важно. Но я пока не дорос до такого.
Все-таки хотел бы чуть-чуть разобраться хотя бы с файловым фвариантом. |
|||
14
Бюро пиявок
13.10.13
✎
11:58
|
(12) Так. Что это для нас значит? Что потом начнутся глюки? Нельзя ли привести пример? Вот у меня в строке 14 всего два разряда, и глюки прут.
|
|||
15
Зойч
13.10.13
✎
11:59
|
храни такие числа в виде строк да и все
|
|||
16
Бюро пиявок
13.10.13
✎
12:04
|
(15) Не все. Разобраться хочу.
|
|||
17
Rie
13.10.13
✎
12:06
|
(14) Честно говоря, из картинки из (0) совершенно непонятно - что в строке 14 (как в других строках) выведено.
|
|||
18
Бюро пиявок
13.10.13
✎
12:11
|
(17) Не понял вопрос. В реквизите внешней обработки стояла длина 32 и точность 32. При помещении туда числа произошел сбой, и мы видим 0,99 в периоде. А при записи в базу точность была 30, ну, округлила до 1. Т.е. эту строчку как ключевую я бы не выделял.
|
|||
19
Rie
13.10.13
✎
12:22
|
(18) Если длина = 32 и точность = 32, значит, целой части - не предусмотрено. Вот и.
|
|||
20
Бюро пиявок
13.10.13
✎
12:28
|
(19) Что-то я не пойму ничего.
Что такое длина? Это все количество цифр справа и слева от запятой? И, как бы задавая точность, мы увеличиваем дробную часть, но крадем пространство у целой части? Ок. Тогда опять же длина не может быть больше 32. Иначе она просто не запишется в базу. |
|||
21
Бюро пиявок
13.10.13
✎
12:29
|
(19) Подождите, не понятно ничего. Я же могу написать: длина 2, точность 15. Имея в виду , что целая часть будет два знака, а дробная - 15. Не так?
|
|||
22
rphosts
13.10.13
✎
12:29
|
(20) >Что такое длина? Это все количество цифр справа и слева от запятой?
да >И, как бы задавая точность, мы увеличиваем дробную часть, но крадем пространство у целой части? да |
|||
23
rphosts
13.10.13
✎
12:30
|
(21) конфигуратор позволит? точно проверяли?
|
|||
24
Rie
13.10.13
✎
12:31
|
(21) Нет, не так. Так - не можешь.
|
|||
25
Бюро пиявок
13.10.13
✎
12:35
|
(23) (24) Действительно, нельзя, конфигуратор не позволит.
Так, что у нас тогда в строке 14 происходит? Получается, что он берет максимально возможное число меньше нуля. Так, вроде. |
|||
26
Rie
13.10.13
✎
12:40
|
(25) Он (вернее "оно" - поскольку "1С:Предприятие"; или "она" - поскольку "платформа") пытается выполнить инструкцию в рамках дозволенного. А раз дозволили ей не больше 1 - вот она и изродила такой перл.
|
|||
27
Бюро пиявок
13.10.13
✎
12:43
|
Вроде бы, разобрался. Спасибо.
|
|||
28
Бюро пиявок
13.10.13
✎
12:49
|
Послушайте, так 38-то вообще не применяется, получается? Ведь в конфигураторе только 32 можно задать.
|
|||
29
Зойч
13.10.13
✎
13:02
|
(21) запятая тоже входит в длину и занимает 1 знак
|
|||
30
Бюро пиявок
13.10.13
✎
13:29
|
(29) Я поэкспериментировал - кажет, не занимает.
У константы задал длину 6, точность - 3. А = 123.123; Константы.КК1.Установить(А); Сообщить("А = " + А); Сообщить("Константы.КК1 = "+ Константы.КК1.Получить()); Выдает прекрасно 123,123. Кстати, что за бесячьи игры с запятой. У меня стояла точка в качестве разделителя. Причем, если туда поставить запятую в программном коде, то получаешь ошибку. А вот - надо же - в процессе выполнения вдруг система вспомнила, что запятую надо вкатить. Чудеса, да и только. Меняю в языке и региональных стандартах винды разделитель на точку. Запускаю - все равно запятая в 1С подставляется. |
|||
31
Rie
модератор
13.10.13
✎
13:50
|
(30) Ну почитал бы ты чего-нибудь по программированию, что ли...
Есть синтаксис программы. Есть вывод данных пользователю. Настраиваемый, кстати. Есть "локали" ("культуры")... |
|||
32
Мимохожий Однако
13.10.13
✎
14:08
|
(30)Метод СтрДлина() что показывает?
|
|||
33
Бюро пиявок
13.10.13
✎
19:09
|
(32) Мы говорим о числе. Не понял вашу мысль - причем здесь СтрДлина()?
|
|||
34
EvgeniuXP
13.10.13
✎
19:19
|
(0) смотри курсы Гилева, там рассказывали...
|
|||
35
Бюро пиявок
13.10.13
✎
19:36
|
(34) Я их смотрю как раз сейчас. Либо пропустил, либо не дошел еще.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |