Mariadb

在浮點數據類型 MariaDB 10.4.8 上選擇結果不同

  • August 30, 2021

在 MariaDB 上

我有浮點數據類型的簡單表

CREATE TABLE `testatt` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nilai` float DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1

當我插入這樣的數據時

insert into testatt (nilai) values (6.83333)

然後我選擇

select * from testatt

結果變成

6.8333301544

這是正常的或需要更多配置。

我使用 MariaDB 10.4.8

FLOAT,根據定義,包含大約​​ 7 個有效數字。之後的任何數字都將是“垃圾”。同樣,DOUBLE有大約 16 個有效數字的限制。

6.83333000000000000000000 -- what you tried to insert
6.8333301544  -- what you got when displaying
1 234567xxxx  -- counting the significant digits

這一切的原因是它FLOAT被定義為一個 24 位二進制數加上指數和符號。24 位只能保存 16M 不同的值。6.8333301544… 是封閉的可能 24 位值 6.83333。

正如所指出的,您可以將其儲存在

DECIMAL(m,n) with n>=5 and m>=n+1

這可以準確地儲存 6.83333 而沒有任何損失。(它不儲存在“二進制”中。)

您暗示 10.4.8 與 10.4.5 不同;請提供更多細節。的定義FLOAT在 1980 年代初被標準化(參見 IEEE-754)。MySQL 和 MariaDB 只是簡單地使用了該標準。

6.83333可能來自41/6。這樣的商不能FLOAT或中精確表示DECIMAL

課程:使用FLOATDOUBLE進行近似測量(溫度、面積等)DECIMAL用於金錢。

引用自:https://dba.stackexchange.com/questions/298245