Visual Foxpro 9 Странное поведение с большими числовыми значениями - PullRequest
0 голосов
/ 19 сентября 2018

Может кто-нибудь объяснить это поведение и предложить способ его обойти?

В окне команд на VFP 9.

Тест 1

a = 7003602346555440

?a

Отображает правильное значение.

Тест 2

a = 7003602346555438

?a

Все еще в порядке.

Тест 3

a = 7003602346555439

?a

Отображает неверное значение 7003602346555440

Тест 4

?a = 7003602346555439

Возвращает .T.как и следовало ожидать.

Тест 5

?VAL (7003602346555439)

Отображает неверное значение 7003602346555440

Очевидно, что происходит какое-то странное преобразование числового значения в текстовое представление для отображения, но кто-нибудь может предложить способ избежать этого и убедиться, что я всегдаполучить правильную текстовую версию числа?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Несмотря на то, что в документации сказано, что val () округляется после 16 цифр, оно часто округляется до 16 и выше.В примере, который вы показываете, используется 16 цифр, что вызывает округление val ().

0 голосов
/ 19 сентября 2018

Источник из этой статьи

РЕЗЮМЕ

Документально подтверждено, что Visual FoxPro имеет 16 цифр точности.Это приблизительное значение: фактическое максимально точное представимое число равно 9007199254740992 (2 ^ 53).

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Числа с плавающей запятой хранятся в 8-байтовых или 64-битных представлениях.Есть 12 битов служебной информации, оставляя 52 бита для хранения номера.Есть еще один подразумеваемый бит, который дает вам максимум 2 ^ 53.Максимальное число, которое может быть сохранено Visual FoxPro, составляет 2 ^ 1023.Наивысшая мощность двух, которая распечатывается именно с помощью?команда со значением по умолчанию SET DECIMALS TO 2: 2 ^ 43.

Следующий код демонстрирует это:

SET DECIMALS TO 2?2 ^ 43 && Отображаются все цифры
?2 ^ 44 && Научное обозначение

УСТАНОВИТЬ ДЕСЯТИЧНЫЕ С 5
?2 ^ 53 && Максимально точное число

?2 ^ 53 - 1 && Правильный результат
?2 ^ 53 + 1 && Неверный результат: округлено с плавающей запятой

?2 ^ 1023 && Невозможно отобразить: * будут напечатаны
?2 ^ 1022 && Может отображать

...