【发布时间】:2013-08-31 16:27:08
【问题描述】:
在为科学应用编写函数时,我遇到了问题。我将其追溯到 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 位四舍五入,然后添加五个零以达到所需/指定的精度。那是作弊。
是我弄错了,还是文档有误?
【问题讨论】:
-
+1 。 . .我已经验证即使
cast(0.0000339946499848118887' as decimal(60, 25))也是如此。我认为问题可能出在浮点常量上,但字符串到十进制的转换也会发生。 -
更新:我发现,在声明 DECIMAL(M, D) 时,MySQL 在 D>30 时返回错误。我找不到它的官方文档,但我想 30 是 D 的极限。但上面的发现也与此相矛盾。
-
@GordonLinoff:我对 SQL 了解不多,但是在 mysql shell 中,语句
select cast('0.0000339946499848118887' as decimal(60, 25));按预期返回0.0000339946499848118887000。你看到了什么?
标签: mysql stored-procedures precision stored-functions