2016-02-10 2 views
1

Мне нужно присоединиться к двум таблицам - одна таблица имеет домашний телефон CHAR30, который, как представляется, имеет выравнивание по центру, а другой домашний - как число 20. Мне нужно преобразовать на число 20, но когда я делаю это, он кажется усеченным, возможно, из-за странного выравнивания (на самом деле не все 30 позиций).Преобразование длинного символьного поля в числовое, НЕ научное обозначение (SAS)

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

+2

Если вы имеете дело с большими числами, я бы рекомендовал сохранить ваш ID как CHAR30 вместо этого, чтобы избежать возможных ошибок точности. В общих полях идентификатора должны быть символы не числовые - они не имеют значения. – Reeza

+0

Да .... Идентификатор не имеет никакого смысла как числового, но так оно и есть в многочисленных таблицах, с которыми я работаю. Мне нужно найти обходное решение или преобразовать все в характер, который его затрагивает. – user3791254

ответ

0

Используйте формат bestd32.. Он имеет тенденцию хорошо работать для длинных ключевых переменных. В зависимости от длины переменной вы можете изменить 32 на любую нужную длину.

1

Пока номер преобразуется должным образом, не имеет значения, какой формат он имеет. Формат просто сообщает SAS, как показать вам номер. За кулисами это просто ДВОЙНАЯ.

1,0 = 1 = 1E0

Теперь, если вы превратили в число и не может получить соединение, а затем посмотреть на informat вы использовали, чтобы прочитать его.

попробовать

num_id = input(strip(char_id),best32.); 

Полоска удаляет передние и задние заготовки. BEST32. INFORMAT пытается «лучше всего» читать число до 32 символов.

+1

Обратите внимание, что 'BEST' - это формат. Если вы используете 'BEST32.'в качестве информации вы получите тот же результат, что и с использованием' 32.' или 'F32.'. – Tom

+0

@ Тома, хорошая точка. – DomPazz

+0

Хорошо, так что это число 8. но и формат, и информация - 20. Как эта цифра в этом? – user3791254

1

Вы не можете сохранить 20-значное число в виде числа в SAS. SAS хранит все числа в виде 8-байтовой с плавающей запятой и поэтому не имеет достаточного количества бит, чтобы представлять много цифр однозначно. Вы можете спросить SAS, что представляет собой наибольшее целое число, которое оно может точно представлять с помощью функции CONSTANT().

1 data _null_; 
2  x=constant('EXACTINT',8); 
3  put x = comma32. ; 
4 run; 

x=9,007,199,254,740,992 

Прочитайте и сохраните свои 20 и 30-значные строки в качестве символьных переменных.

0

Основываясь на комментариях по оригинальному вопросу, единственное, что вы можете сделать, это преобразовать все поля ID в строки и использовать строки для объединения. @Reeza предложил это в одном из комментариев, но он должен был быть отправлен в качестве ответа.

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

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

Убедитесь, что вы не читаете числа в SAS как числовые, а затем преобразуете в строку. Если вы делаете это так, вы все равно теряете точность, как только числа сохраняются в SAS как числовые переменные.

Смежные вопросы