powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Глюки функции VAL() ?
12 сообщений из 12, страница 1 из 1
Глюки функции VAL() ?
    #32448048
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
А никто с такой ерундой не сталкивался?
?6763627696664469
или, то же самое
?VAL("6763627696664469")
Это и в 7-ой, и в 8-ой версии...
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448070
Peper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неа, только с такой
?67636276966644693456346756472436492836329763189771376973289769732
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448170
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Peper и т.п.:
Спасибо! УмнО! Наверное, в лом Фокс запустить? Лично для Вас:
?6763627696664469 как и ?VAL("6763627696664469") выводит вот такой результат: 67636276966644 70
Проблема больших чисел?
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448288
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А документацию читать "не в лом" ?

VAL( ) FunctionSee Also
SET DECIMALS | STR( ) | SYS( ) Functions Overview
Returns a numeric or currency value from a character expression composed of numbers. You can use VAL( ) to convert the character strings returned by the Visual FoxPro SYS( ) functions to numeric values.

VAL(cExpression)
Parameters
cExpression
Specifies a character expression composed of up to 16 numbers. Rounding occurs if more than 16 numbers are included in cExpression.
If the first character of cExpression is a dollar sign ($),VAL( ) returns a currency value. In all other situations VAL( ) returns a numeric value.

Удачи в новых экспериментах!
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448292
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Sergey!
Sorry, "француз" я... Но даже с моим скудным английским - читал, не обламывался: "Rounding occurs if more than 16 numbers are included in cExpression" - в моем примере не более 16 цифр. И почему же не округляется "6763627696664468"?
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448294
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку... Черт с ним, с этим VAL()! А простой " ? " почему так делает?
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448350
создать курсор типа
Код: plaintext
1.
2.
create cursor ccc (num b ( 0 ))
insert into ccc value ( 6763627696664469 )
insert into ccc value ( 6763627696664471 )

Затем можно попробовать ввести это число вручную.
Это - не глюк, это - недокументированная особенность!!
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32448550
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Пособие для начинающих"
"Типы данных"

==================================================
Numeric (Float)

Numeric и Float - это два разных названия для одного и того же типа данных. В дальнейшем, я буду говорить о типе данных Numeric. По умолчанию, любая переменная памяти, содержащая число интерпретируется как переменная типа Numeric, если тип переменной не был указан явно каким-либо способом.

Очень важным для понимания особенностей типа данных Numeric является то обстоятельство, что физически эти данные хранятся как символьные данные. Т.е. каждая цифра, а также символ разделитель целой и дробной части физически хранятся как обычные символы. Если Вы откроете файл DBF как обычный текстовый файл (например, с помощью программы "Блокнот" ("Notepad")), то Вы увидите, что число 1234.56 прямо так и записано. Нет какого-либо преобразования.

Как следствие, ничто не мешает вместо дробной части записать целую часть числа. И действительно, если Вы определите размерность поля, например, как Numeric(5,2), то в такое поле можно записать данные до значения 99999, а не 99.99 как предполагается из заданной размерности. Т.е. указание дробной части носит скорее рекомендательный, чем обязательный характер и вся дробная часть (включая символ разделитель) в случае необходимости может быть использована для записи целой части числа.

Выполните такую проверку

Код: plaintext
1.
2.
3.
CREATE CURSOR test (test N( 5 , 2 ))
INSERT INTO test VALUES ( 12 . 34 )
INSERT INTO test VALUES ( 12345 )
BROWSE NOWAIT

Фактически, работая с полями типа Numeric, если у них задана дробная часть, то Вы всегда имеет некоторый запас размерности на количество знаков дробной части плюс один знак на символ разделитель.

Другая особенность касается не столько типа данных Numeric, сколько числовых данных вообще. Дело в том, что системным ограничением FoxPro является тот факт, что при любых расчетах точность вычисления ограничивается 16 значащими цифрами. Это значит, что если Вы желаете посмотреть более 16 значащих цифр, то все последующие разряды будут заполнены "мусором". Точнее случайными данными.

Выполните такую проверку

Код: plaintext
1.
2.
CREATE CURSOR test (test N( 20 ))
INSERT INTO test VALUES ( 12345678901234567890 )
BROWSE NOWAIT

Вы увидите, что реально оказались заполнены только первые 14 разрядов. Здесь сыграли роль другие факторы, которые уменьшили количество значащих цифр еще на 2.

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

Повторюсь еще раз - это особенность не типа данных Numeric, а системное ограничение FoxPro. Т.е. справедливо для любого числового типа данных
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32449099
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирM...сыграли роль другие факторы, которые уменьшили количество значащих цифр еще на 2...
Владимир! Именно эти самые "другие факторы" меня и интересуют... И если их нельзя устранить, то как их обойти?
P.S. "Пособие для начинающих" мне не нужно - я с Фоксом с 92-го...
P.S.S. Просто раньше проблема 16-ти цифр не возникала, а тут появились банкиры, которым подавай 16 знаков (номер пластиковой карточки) обязательно как Numeric :-(
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32449209
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю логику работы FoxPro, то здесь какие-то заморочки с округлением происходят.

Чтобы получить достоверными 16 разрядов необходимо уметь работать с 18 (это из мат.теории - количество достоверных+2). А поскольку FoxPro умеет работать только с 16 разрядами, то надеятся (считать достоверными) можно только на 14 разрядов.

В FoxBase была такая команда SET PRECISION, но в VFP она не работает (точнее всегда устанавливает 16)

Так что, реальным остается только работа с символьными данными :(

Тем более, если речь идет о номере карточки, то использование Character предпочтительнее. Я так понимаю, они настаивают на числовых типах исходя из необходимости как-то анализировать этот код. Думаю, этот анализ вполне можно сделать и для символьного типа.

Впрочем, попробуй повторить свой вопрос на сайте

http://forum.foxclub.ru/list.php?f=5

Там больше народу. Может кто посоветует что-нибудь еще.
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32449231
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет Character - абсолютно согласен! Так я им и сделал - пускай сами мучаются!
...
Рейтинг: 0 / 0
Глюки функции VAL() ?
    #32450073
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Redrik

Привидите им пример Западных программ - там везде номера кредитных карт хранятся в символьном виде :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Глюки функции VAL() ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]