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

时间:2019-03-24 23:12:22

标签: mysql select precision decimal-point

我正在尝试为执行某些方程式的SELECT取得相同的精度(小数点后的位数)。

  1. 在CAST()或ROUND()之间获得所需精度的情况下,性能,良好使用习惯方面是否存在差异?有更好的选择吗?

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

我正在使用MySQL 8。

如果您运行示例E1

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

小数点后将显示4位数字。

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

    -E2 SELECT ROUND((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

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

1 个答案:

答案 0 :(得分:2)

MySQL使用64位IEEE-754浮点(也称为DOUBLE)进行内部计算,除非通过强制转换常量明确使用整数或十进制算术。

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

使用这些功能不会对性能造成太大影响。许多使用普通SQL(而不是用Java,PHP或其他语言的应用程序检索的SQL)的程序员总是使用其中一个功能来保持对渲染的控制。

请仔细测试您是否在计算中依赖DECIMAL数据类型的准确性:MySQL确实希望以DOUBLE的方式进行处理。或者,更好的是,使用强类型语言来精确控制您的算术。