MySQL SELECT Точность расчета (цифры после десятичной точки) - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь добиться такой же степени точности (количество цифр после десятичной запятой) для результатов, поступающих из SELECT, который выполняет некоторые уравнения.

  1. Есть ли какая-либо разница с точки зрения производительности, хорошая практика использования в случае достижения требуемой точности между CAST () или ROUND () помимо округления до последнего?Есть ли лучшая альтернатива?

Для простоты значения во всех приведенных ниже примерах жестко закодированы, они могут или не могут быть получены из столбцов таблицы

Я использую MySQL 8.

Если вы запустите пример E1:

-- E1
SELECT (41/99);
-- 0.4141

, вы получите 4 цифры после десятичной точки.

Есть ли какая-либо настройка MySQL, которая может принести более высокую точность прямо из коробки, поэтому мне не нужно использовать:

- E2 SELECT ROUND ((41/99), 20);- 0,41414141400000000000

- или

SELECT CAST ((41/99) AS DECIMAL (21,20));- 0,41414141400000000000

Как получить больше точности десятичных знаков от E2, если для расчета используются данные типа int?

Если вы укажетеДля данных с десятичной точкой вы получаете гораздо более высокую точность:

-- E3
SELECT ROUND((41.0/99.0), 20);
-- 0.41414141414141414100

SELECT CAST((41.0/99.0) AS DECIMAL(21,20));
-- 0.41414141414141414100

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

1 Ответ

2 голосов
/ 25 марта 2019

MySQL использует 64-битные IEEE-754 с плавающей запятой (он же DOUBLE) для своих внутренних вычислений, если вы специально не заставите его использовать целочисленную или десятичную арифметику путем приведения ваших констант.

При отображении чисел лучше всего отображать их в десятичном виде с максимально возможной точностью. С DOUBLE это требует преобразования в десятичное число. Если вам не нужна точность рендеринга по умолчанию, а вы хотите контролировать ее самостоятельно, вы можете использовать функции ROUND() или TRUNCATE(). Вот как ты это контролируешь.

Нет большого снижения производительности за использование этих функций. Многие программисты, которые используют простой SQL (а не SQL, полученный прикладной программой на Java, PHP или другом языке) всегда используют одну из функций для сохранения контроля над рендерингом.

Тщательно протестируйте, если вы зависите от точности типов данных DECIMAL в вычислениях: MySQL действительно хочет сделать их в DOUBLE. Или, что еще лучше, используйте строго типизированный язык, чтобы получить точный контроль над своей арифметикой.

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