Проблема не в хранилище. В вашем примере значение было нарушено перед сохранением его в таблице.
К сожалению, если вы напишете 1/3, это будет вычислено (и вставлено) с использованием представления по умолчанию:
SELECT 1/3
0.333333333
который, как видите, имеет недостаточную точность.
Дополнительная проблема заключается в том, что когда вы отправляете константу (1 или 3) на сервер, вы делаете это с помощью библиотеки или коннектора, которые могут позволить себе вольности с ценность. Например, он может считать, что «1» и «3» — целые числа, и их результат следует рассматривать как целое число. Таким образом, вы получаете «1/3 = 0», но «1./3 = 0,333333», потому что точка в «1». заставляет коннектор понять, что ему нужно использовать плавающую точку по умолчанию. И вы получаете только шесть 3-х, потому что «плавающая точка по умолчанию» соединителя имеет 6 цифр. Затем вы сохраняете его в базе данных, но уже слишком поздно. Вы сохраняете с высокой точностью значение, которое было усечено до низкой точности.
Вы можете попробовать приводить константы с самого начала. Вместо «1» вы используете приведение 1 к достаточно большому десятичному знаку. Я использую ваши 31,30 здесь, но убедитесь, что вам не нужно хранить большие числа. Возможно, "31,20" было бы лучше.
mysql> SELECT 1/3 UNION SELECT CAST(1 AS DECIMAL(31,30))/CAST(3 AS DECIMAL(31,30));
+----------------------------------+
| 1/3 |
+----------------------------------+
| 0.333333333000000000000000000000 |
| 0.333333333333333333333333333333 |
+----------------------------------+
2 rows in set (0.00 sec)
Это очень неудобно, но результаты должны быть лучше. Кроме того, я думаю, что в выражении необходимо привести только одно значение one; Затем MySQL будет продвигать все задействованные количества по мере необходимости. Таким образом, может быть достаточно добавления CAST(0 AS DECIMAL(x,y)) к суммам и CAST(1 AS DECIMAL(x,y)) к умножениям.
mysql> SELECT 3*CAST(1 AS DECIMAL(31,30))/CAST(3 AS DECIMAL(31,30));
+-------------------------------------------------------+
| 3*CAST(1 AS DECIMAL(31,30))/CAST(3 AS DECIMAL(31,30)) |
+-------------------------------------------------------+
| 1.000000000000000000000000000000 |
+-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(1 AS DECIMAL(31,30))*1/3;
+----------------------------------+
| CAST(1 AS DECIMAL(31,30))*1/3 |
+----------------------------------+
| 0.333333333333333333333333333333 |
+----------------------------------+
1 row in set (0.00 sec)
Обратите внимание, что это не работает, потому что умножение имеет более высокий приоритет:
mysql> SELECT CAST(0 AS DECIMAL(31,30))+1/3;
+----------------------------------+
| CAST(0 AS DECIMAL(31,30))+1/3 |
+----------------------------------+
| 0.333333333000000000000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
person
LSerni
schedule
16.03.2017