Что такое максимальная десятичная точность в Marklogi c 10 и как использовать в моем json документе? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь вставить документ JSON с десятичными значениями, который имеет десятичную точность более 10, но он автоматически применяет округление до 9, и когда я получаю этот документ, он показывает только 9 десятичную точность.

declareUpdate(); 
var uri = '/test.json'; 
var root = { id: 1, value: 56900.123456789012345678901 }; 
xdmp.documentInsert(uri, root);

Любая идея вставить / получить более 9 десятичных знаков точности в MarkLogi c?

1 Ответ

0 голосов
/ 22 апреля 2020

В JSON числа имеют двойную точность.

https://tools.ietf.org/html/rfc7159

Поскольку программное обеспечение, которое реализует двоичные64 (двойной точности) IEEE 754-2008 [IEEE754], широко доступно и широко используется, хорошая совместимость может быть достигнуто реализациями, которые ожидают не большей точности или диапазона, чем те, которые они обеспечивают, в том смысле, что реализации будут приближаться к JSON числам в пределах ожидаемой точности. Число JSON, такое как 1E400 или 3.141592653589793238462643383279, может указывать на потенциальные проблемы совместимости, поскольку предполагает, что созданное им программное обеспечение ожидает, что принимающее программное обеспечение будет иметь более широкие возможности для числовой c величины и точности, чем широко доступно.

Итак, вы получите до 17 значащих цифр.

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

53-битное значение и точность дают от 15 до 17 точность значащих десятичных цифр (2−53 ≈ 1,11 × 10−16). Если десятичная строка, содержащая не более 15 значащих цифр, преобразуется в представление двойной точности IEEE 754, а затем преобразуется обратно в десятичную строку с тем же количеством цифр, конечный результат должен соответствовать исходной строке. Если число двойной точности IEEE 754 преобразуется в десятичную строку, содержащую не менее 17 значащих цифр, а затем возвращается обратно в представление двойной точности, окончательный результат должен соответствовать исходному числу. [1]

Вы получите тот же результат, если выполните в консоли браузера следующее:

56900.123456789012345678901 + 0

Возвращает

56900.12345678901

И если переместить десятичную дробь вправо, то же число значащих цифр:

5690012345678901.2345678901 + 0

выход:

5690012345678901

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

Для чего вам нужен этот уровень точности?

...