在寫科學應用的功能MySQL的精密型問題,我遇到了問題。我追溯到MySQL缺乏精確性。在十進制數字化數據類型
以下是來自官方文檔的頁面,聲明DECIMAL的最大位數是65 - http://dev.mysql.com/doc/refman/5.6/en/fixed-point-types.html。它還描述瞭如果值超過指定的精度,值將如何舍入。
這裏是可重複的代碼(MySQL存儲功能),以測試它 -
DELIMITER $$
DROP FUNCTION IF EXISTS test$$
CREATE FUNCTION test
(xx DECIMAL(30,25)
)
RETURNS DECIMAL(30,25)
DETERMINISTIC
BEGIN
DECLARE result DECIMAL(30,25);
SET result = 0.339946499848118887e-4;
RETURN(result);
END$$
DELIMITER ;
如果你在一個名爲TEST.SQL文件保存上面的代碼,你可以通過執行以下運行MySQL提示 -
source test.sql;
select test(0);
它產生的輸出 -
+-----------------------------+
| test(0) |
+-----------------------------+
| 0.0000339946499848118900000 |
+-----------------------------+
1 row in set (0.00 sec)
正如你所看到的,數量越來越在第20位四捨五入,再用5個零被添加到它來獲得所要求的/指定的精密度。這是作弊。
是我錯了,或者是文檔錯了嗎?
+1。 。 。我已經驗證過,即使使用'cast(0.0000339946499848118887'爲十進制(60,25))'也是如此。我認爲這個問題可能是浮點常量,但它也發生在字符串到十進制轉換之間。 –
更新:我發現,在聲明DECIMAL(M,D)時,當D> 30時,MySQL返回一個錯誤。我找不到官方文件,但我認爲30是D的限制。但上述發現也與此相矛盾。 – Soumendra
@GordonLinoff:我不太瞭解SQL,但在mysql shell中,語句'select cast('0.0000339946499848118887'爲十進制(60,25));'返回'0.0000339946499848118887000'正如預期的那樣。你看到了什麼? – ShreevatsaR