gpt4 book ai didi

DECIMAL NUMERIC 数据类型中的 MySQL 精度问题

转载 作者:可可西里 更新时间:2023-11-01 07:59:05 25 4
gpt4 key购买 nike

在编写用于科学应用的函数时,我遇到了问题。我将其追溯到 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 位四舍五入,然后向其添加五个零以达到所需/指定的精度。那是作弊。

是我弄错了,还是文档有误?

最佳答案

发生这种情况是因为 mysql 将 0.339946499848118887e-4 视为 float 并将 0.0000339946499848118887 视为定点

mysql> select cast(  0.339946499848118887e-4 as DECIMAL(30, 25));
+----------------------------------------------------+
| cast( 0.339946499848118887e-4 as DECIMAL(30, 25)) |
+----------------------------------------------------+
| 0.0000339946499848118900000 |
+----------------------------------------------------+
1 row in set (0.00 sec)

mysql> select cast( 0.0000339946499848118887 as DECIMAL(30, 25));
+-----------------------------------------------------+
| cast( 0.0000339946499848118887 as DECIMAL(30, 25)) |
+-----------------------------------------------------+
| 0.0000339946499848118887000 |
+-----------------------------------------------------+
1 row in set (0.00 sec)

precision math - expression handling 上的 mysql 文档中所述-

If any approximate values are present, the expression is approximate and is evaluated using floating-point arithmetic.

引自 numerical types 上的文档,

Two numbers that look similar may be treated differently. For example, 2.34 is an exact-value (fixed-point) number, whereas 2.34E0 is an approximate-value (floating-point) number.

关于DECIMAL NUMERIC 数据类型中的 MySQL 精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com