MySQL SELECT 计算精度(小数点后位数)

MySQL SELECT Precision of calculation (digits after decimal point)

我正在努力使来自 SELECT 的结果具有相同的精度(小数点后的位数),它执行一些方程式。

  1. 除了最后一个四舍五入外,CAST() 或 ROUND() 之间在性能、使用良好实践方面是否有任何差异以实现所需的精度?有没有更好的选择?

为了简单起见,以下所有示例中的值都是硬编码的,它们可能来自也可能不是来自 table 的列

我正在使用 MySQL 8.

如果你 运行 示例 E1 :

-- E1
SELECT (41/99);
-- 0.4141

小数点后4位。

  1. 是否有任何 MySQL 设置可以立即带来更高的精度,所以我不需要使用:

    -- E2 SELECT回合((41/99),20); -- 0.41414141400000000000

    -- 或

    SELECT CAST((41/99) AS DECIMAL(21,20)); -- 0.41414141400000000000

  2. 如果用于计算的数据是int,如何从E2中获取更多的小数点精度?

如果您提供带小数点的数据,您将获得更高的精度:

-- E3
SELECT ROUND((41.0/99.0), 20);
-- 0.41414141414141414100

SELECT CAST((41.0/99.0) AS DECIMAL(21,20));
-- 0.41414141414141414100

避免浮点数据类型对我来说很重要,因为它们是小数的近似值。如果数据来自 table 列,则该列将为十进制数据类型。但是用于计算的数据也可能是硬编码的。

MySQL 使用 64 位 IEEE-754 浮点数(又名 DOUBLE)进行内部计算,除非您通过转换常量专门让它使用整数或小数运算。 (Java脚本也是如此。)

显示数字时,它会尽可能准确地以十进制显示它们。对于 DOUBLE,这需要转换为十进制。如果您不想要默认的渲染精度,而是想自己控制它,您可以使用 ROUND() or TRUNCATE() 函数。这就是你控制它的方式。

使用这些函数不会有太大的性能损失。许多程序员使用纯 SQL(而不是 Java、PHP 或其他语言的应用程序检索的 SQL)always 使用其中一项功能来保留对渲染的控制。

如果您在计算中依赖于 DECIMAL 数据类型的准确性,请仔细测试:MySQL 真的想用 DOUBLE 进行计算。或者,更好的是,使用强类型语言来精确控制您的算法。