ObjectNodeX и количество знаков после запятой

MapInfo, MapBasic
Ответить
Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 22 авг 2017, 17:35

Добрый день! Подскажите, пожалуйста, как повлиять на количество знаков после запятой в значениях, которая возвращает функция ObjectNodeX|Y. Не в плане округления, а наоборот - выдать, к примеру, 4 знака или больше.

Пример:

Код: Выделить всё

Dim myObj As Object
Set CoordSys NonEarth Units "m" Bounds (-100000, -100000) (100000, 100000)

Create Region Into Variable myObj 1 6
(81234.123456, 1) (80123.123456, 2) (8012.123456, 3) (801.123456, 4) (80.123456, 5) (8.123456, 6)

Print ObjectNodeX(myObj, 1, 1)
Print ObjectNodeX(myObj, 1, 2)
Print ObjectNodeX(myObj, 1, 3)
Print ObjectNodeX(myObj, 1, 4)
Print ObjectNodeX(myObj, 1, 5)
Print ObjectNodeX(myObj, 1, 6)
Результат:

Код: Выделить всё

81234.12
80123.12
8012.12
801.124
80.1235
8.1235

thegeo
Активный участник
Сообщения: 152
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 71

Re: ObjectNodeX и количество знаков после запятой

Сообщение thegeo » 22 авг 2017, 19:54

Попробуйте так

Код: Выделить всё

print Format$(ObjectNodeY(myObj, 1, 5),"#.###0")

Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

Re: ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 23 авг 2017, 09:01

Попробовал: для 4 разрядов и более выдает, почему-то, "81234.1235" - больше 4 цифр после запятой не выдает + непонятное округление. То есть, задаю #.##### (или 0) и "хвост" числа получается ".1235"...

Sibit
Активный участник
Сообщения: 203
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: ObjectNodeX и количество знаков после запятой

Сообщение Sibit » 23 авг 2017, 11:02

Потому, что координаты хранятся в дискретных значениях. Точность = (границы координатной системы)/2*10^9 (это такое магическое число). В вашем случае 9 - 5 = 4, т.е точность 0.0001. Попробуйте уменьшить значения в выражении Bounds, сразу точность подскочит.

Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

Re: ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 23 авг 2017, 11:54

А есть ли способ получить от ObjectNodeX число Float с нужным числом разрядов и без округления? Или пусть это будет текст, но без округления последнего разряда?

Sibit
Активный участник
Сообщения: 203
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: ObjectNodeX и количество знаков после запятой

Сообщение Sibit » 23 авг 2017, 12:07

Не понял вопрос. ObjectNodeX возвращает свойство объекта в текущей системе координат. Т.е. точнее чем оно там храниться получить нельзя.

Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

Re: ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 23 авг 2017, 12:33

См. первое сообщение: координата X = 81234.123456 Теперь получим ее: ObjectNodeX(myObj, 1, 1); если учесть Ваше замечание по поводу дискрета, то результат должен быть (хотелось бы именно такой увидеть) = 81234.1234 (4 знака, что неплохо). Я же вижу 81234.12 (два знака, если сделать Print). Если же применить форматирование, как предложил thegeo, то получается 81234.1235 - текстовое представление, то есть не Float и округление.

Sibit
Активный участник
Сообщения: 203
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: ObjectNodeX и количество знаков после запятой

Сообщение Sibit » 23 авг 2017, 12:42

Тогда встречный вопрос, а как по вашему работает print ? Нет ли там неявного преобразования к строке?
А что будет если выводить значения так : Print Format$(ObjectNodeX(myObj, 1, 1),"#.####################") ? :)

Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

Re: ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 23 авг 2017, 15:51

Наверно есть, я уже думал об этом.
А выводить будет те же 4 знака по сути (для первой координаты X из примера), то есть "Число.12350000000002".

Sibit
Активный участник
Сообщения: 203
Зарегистрирован: 21 окт 2009, 13:29
Проекты: 1
Репутация: 27
Откуда: Новосибирск

Re: ObjectNodeX и количество знаков после запятой

Сообщение Sibit » 24 авг 2017, 06:53

Qwe1 писал(а):
23 авг 2017, 15:51
А выводить будет те же 4 знака по сути
Неверно :) будет вы водить число полностью. Вообще, это проще проверить чем объяснить.
Просто попробуйте поменять значения границ у текущей системы координат, и посмотреть вывод функции. В вашем случае округление происходит 2 раза, при создании объекта, и при выводе координат. print тоже делает делает округление при выводе, но оно на вычисления не влияет.

Qwe1
Интересующийся
Сообщения: 36
Зарегистрирован: 28 мар 2009, 20:02
Репутация: 0

Re: ObjectNodeX и количество знаков после запятой

Сообщение Qwe1 » 24 авг 2017, 09:43

Ключевой момент здесь, видимо действительно в том, что округление происходит на этапе создания объекта под выбранную систему координат с соответствующим охватом! Поэтому, извлекая координату, мы получаем округленный результат с определенным числом знаков. Print выводит число как есть, правда сам определяет сколько знаков вывести, это, опять же, ни как не изменить, разве что использовать текстовое представление с помощью Format.

Boris
Гуру
Сообщения: 4103
Зарегистрирован: 10 апр 2006, 22:34
Статьи: 3
Проекты: 1
Репутация: 400
Откуда: Париж

Re: ObjectNodeX и количество знаков после запятой

Сообщение Boris » 25 авг 2017, 05:38

К чему такие гадания и предположения? MIF файл выложите и все будет ясно - какие границы, и какая точность представления, и что в реальности "внеслось" в таблицу.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя