Sprawdzając nową strukturę bazy danych zauważyłem, że ktoś zmienił pole z float na double. Zastanawiając się dlaczego, sprawdziłem dokumentację mysql, ale szczerze mówiąc nie rozumiałem, na czym polega różnica.
Czy ktoś może wyjaśnić?
Sprawdzając nową strukturę bazy danych zauważyłem, że ktoś zmienił pole z float na double. Zastanawiając się dlaczego, sprawdziłem dokumentację mysql, ale szczerze mówiąc nie rozumiałem, na czym polega różnica.
Czy ktoś może wyjaśnić?
Odpowiedzi:
Obie reprezentują liczby zmiennoprzecinkowe. A FLOAToznacza pojedynczą precyzję, a a DOUBLEpodwójną precyzję.
MySQL wykorzystuje cztery bajty na wartości o pojedynczej precyzji i osiem bajtów na wartości o podwójnej precyzji.
Istnieje duża różnica między liczbami zmiennoprzecinkowymi a liczbami dziesiętnymi (numerycznymi), których można używać z DECIMALtypem danych. Służy do przechowywania dokładnych liczbowych wartości danych, w przeciwieństwie do liczb zmiennoprzecinkowych, gdzie ważne jest zachowanie dokładnej precyzji, na przykład w przypadku danych pieniężnych.
Być może ten przykład mógłby wyjaśnić.
CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2));
Mamy taki stół:
+-------+-------------+
| Field | Type |
+-------+-------------+
| fla | float |
| flb | float |
| dba | double(10,2)|
| dbb | double(10,2)|
+-------+-------------+
Dla pierwszej różnicy próbujemy wstawić rekord z wartością „1,2” w każdym polu:
INSERT INTO `test` values (1.2,1.2,1.2,1.2);
Tabela pokazująca w ten sposób:
SELECT * FROM `test`;
+------+------+------+------+
| fla | flb | dba | dbb |
+------+------+------+------+
| 1.2 | 1.2 | 1.20 | 1.20 |
+------+------+------+------+
Zobacz różnicę?
Próbujemy przejść do następnego przykładu:
SELECT fla+flb, dba+dbb FROM `test`;
Hola! Różnicę możemy znaleźć w ten sposób:
+--------------------+---------+
| fla+flb | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 | 2.40 |
+--------------------+---------+
float(10, 2)
Podwójne są jak pływaki, z wyjątkiem tego, że są dwa razy większe. Pozwala to na większą dokładność.
Myśl Chciałbym dodać własnym przykładzie, że pomógł mi zobaczyć różnicę przy użyciu wartości 1.3podczas dodawania lub mnożenia z innym float, decimali double.
1.3float DODANO do 1.3różnych typów:
|float | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6 | 2.60000 |
1.3float MULTIPLIED przez 1.3różne typy:
| float | double | decimal |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |
Używa MySQL 6.7
Pytanie:
SELECT
float_1 + float_2 as 'float add',
double_1 + double_2 as 'double add',
decimal_1 + decimal_2 as 'decimal add',
float_1 * float_2 as 'float multiply',
double_1 * double_2 as 'double multiply',
decimal_1 * decimal_2 as 'decimal multiply'
FROM numerics
Utwórz tabelę i wstaw dane:
CREATE TABLE `numerics` (
`float_1` float DEFAULT NULL,
`float_2` float DEFAULT NULL,
`double_1` double DEFAULT NULL,
`double_2` double DEFAULT NULL,
`decimal_1` decimal(10,5) DEFAULT NULL,
`decimal_2` decimal(10,5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `_numerics`
(
`float_1`,
`float_2`,
`double_1`,
`double_2`,
`decimal_1`,
`decimal_2`
)
VALUES
(
1.3,
1.3,
1.3,
1.3,
1.30000,
1.30000
);
FLOAT przechowuje liczby zmiennoprzecinkowe z dokładnością do ośmiu miejsc i ma cztery bajty, podczas gdy DOUBLE przechowuje liczby zmiennoprzecinkowe z dokładnością do 18 miejsc i ma osiem bajtów.
Float ma 32 bity (4 bajty) z dokładnością do 8 miejsc. Double ma 64 bity (8 bajtów) z dokładnością do 16 miejsc.
Jeśli potrzebujesz większej dokładności, użyj Double zamiast Float .