Почему 2 числа c со многими десятичными знаками считаются равными в postgres? - PullRequest
1 голос
/ 19 апреля 2020

Почему select (1.9999999999999999+2)/2 = (1.9999999999999999999999999999999999+2)/2 равно true в postgres? Выполнение select pg_typeof((1.9999999999999999999999999999999999+2)/2) показывает тип numeric, который, как утверждают документы, являются точными числами, должен поддерживать тысячи цифр после десятичной дроби.

select 1.9999999999999999 = 1.9999999999999999999999999999999999 возвращает false, как и ожидалось.

Почему выбрать (1.999999999999999+2)/2 показать 1.9999999999999995, как я ожидал, но добавив дополнительный «9» в конце показывает 2.0000000000000000? Разве дополнительный di git не должен увеличивать точность, и я должен также видеть дополнительный «9» в результате?

В каких случаях я могу быть уверен, что не увижу это в своих запросах при выполнении арифметика c на numeric типах?

1 Ответ

1 голос
/ 19 апреля 2020

Числовое выражение c слева содержит только 16 десятичных цифр. Общая оценка выражений ограничена этой точностью.

Попробуйте это:

select (1.9999999999999999000000000000000000+2)/2 = (1.9999999999999999999999999999999999+2)/2   

И вы получите ложь, потому что теперь вы сравниваете 34 десятичных знака с обеих сторон (если я считал правильно) ,

С уважением,
Bjarni

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...