Mysql

MySQL返回四捨五入的浮點數

  • December 16, 2014
> CREATE TABLE test(foo FLOAT);
> INSERT INTO test VALUES(1.2899999);
> SELECT * FROM test;
+------+
| foo  |
+------+
| 1.29 |
+------+

雖然很明顯 FLOAT 不是一種精確的數據類型,但它仍然過於隨意地四捨五入這些數據。讓我們檢查一下它是否真的能夠儲存它:

> ALTER TABLE test MODIFY foo DOUBLE;
> SELECT * FROM test;
+--------------------+
| foo                |
+--------------------+
| 1.2899998426437378 |
+--------------------+

糟糕,由於格式限制,只有第 7 位數字被損壞。在這種情況下,除了將列轉換為 DOUBLE 之外,有沒有辦法防止過度舍入?

我討厭基於精度的問題。我之前處理過一個:Data Truncated for Column

您可能已經手動執行了 ALTER TABLE

CREATE TABLE test_new LIKE test;
ALTER TABLE test_new MODIFY foo DOUBLE;
INSERT INTO test_new (foo) SELECT CONVERT(foo,DOUBLE) FROM test;
RENAME TABLE test TO test_old,test_new TO test;
DROP TABLE test_old;

要麼

CREATE TABLE test_new LIKE test;
ALTER TABLE test_new MODIFY foo DOUBLE;
INSERT INTO test_new (foo) SELECT CONVERT(foo,DECIMAL(10,7)) FROM test;
RENAME TABLE test TO test_old,test_new TO test;
DROP TABLE test_old;

要麼

CREATE TABLE test_new LIKE test;
ALTER TABLE test_new MODIFY foo DOUBLE;
INSERT INTO test_new (foo) SELECT FORMAT(foo,7) FROM test;
RENAME TABLE test TO test_old,test_new TO test;
DROP TABLE test_old;

不確定會發生什麼,但試一試,看看會發生什麼。

也許這篇文章可能對您的問題有所幫助 - 就我到目前為止的經驗(即使在我們服務了近 5 年的 ERP 數據庫中)類型FLOATDOUBLE幾乎從未使用過。取而代之的是所有儲存值的欄位,如成本價格、採購價格、庫存項目特徵、倉庫、生產、會計數據——總是使用 ie (MSSQL) 來計算固定的小數位數NUMERIC(20,8),當然在 MySQL 中也是如此DECIMAL(20,8)。因此,如果要執行任何舍入,則必須(大部分)在應用層中完成。

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