Mysql
MySQL返回四捨五入的浮點數
> 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 數據庫中)類型
FLOAT
或DOUBLE
幾乎從未使用過。取而代之的是所有儲存值的欄位,如成本價格、採購價格、庫存項目特徵、倉庫、生產、會計數據——總是使用 ie (MSSQL) 來計算固定的小數位數NUMERIC(20,8)
,當然在 MySQL 中也是如此DECIMAL(20,8)
。因此,如果要執行任何舍入,則必須(大部分)在應用層中完成。