Как правильно использовать тип с плавающей точкой в ​​MySQL? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть таблица в mysql с типом поля float (10, 7). Я пытаюсь вставить значение 1196.104, даже при использовании phpmyadmin он преобразует это значение в 1000.0000000. Какой тип следует использовать для правильного хранения значения 1196.104 в базе данных.

1 Ответ

0 голосов
/ 05 июля 2018

Это работает точно так, как задумано FLOAT(10,7). Когда вы даете значение, которое не помещается в число цифр, оно ограничивает значение и использует наибольшее значение, которое может поместиться.

В этом случае десятизначное значение 999,99999999 округляется до 1000,0000000.

https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html говорит:

MySQL допускает нестандартный синтаксис: FLOAT (M, D) или REAL (M, D) или DOUBLE PRECISION (M, D). Здесь (M, D) означает, что значения могут быть сохранены в сумме до M цифр, из которых D цифр может быть после десятичной точки.

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

mysql> create table f ( f float(10,7));

mysql> insert into f values (1196.104);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'f' at row 1 |
+---------+------+--------------------------------------------+

mysql> select * from f;
+--------------+
| f            |
+--------------+
| 1000.0000000 |
+--------------+

Если вы хотите сохранить большие значения, объявите FLOAT с достаточным количеством цифр для хранения значений, которые вы используете. Например, значение 1196.104 может быть вставлено в FLOAT(11,7) или FLOAT(10,6).

Или вы можете использовать FLOAT без аргументов, и это вообще не будет ограничивать количество цифр.

Есть некоторые предостережения относительно FLOAT. Это неточный числовой тип, и он будет иметь ошибки округления. Это неизбежно из-за способа реализации FLOAT, и это влияет на каждый язык программирования.

Чтение https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html и https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Также посмотрите мой старый твит об этом: https://twitter.com/billkarwin/status/347561901460447232

enter image description here

...