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

MySQL SELECT Precision of calculation (digits after decimal point)

提问人:Jimmix 提问时间:3/25/2019 最后编辑:user207421Jimmix 更新时间:5/7/2021 访问量:7326

问:

我正在尝试为来自执行某些方程式的 SELECT 的结果实现相同的精度(小数点后位数)。

  1. 在性能方面是否有任何区别,在 CAST() 或 ROUND() 之间实现所需的精度的情况下,除了四舍五入最后一个之外,使用良好做法是否有任何区别?有没有更好的选择?

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

我正在使用 MySQL 8。

如果运行 example :E1

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

您将在小数点后获得 4 位数字。

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

    -- E2型 选择 ROUND((41/99), 20); -- 0.41414141400000000000

    --或

    选择 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

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

mysql 选择 精度 小数点

评论

1赞 Raymond Nijland 3/25/2019
MySQL如何进行浮点加法的数学计算的可能重复?
1赞 Raymond Nijland 3/25/2019
“ 有没有 MySQL 设置可以开箱即用带来更高的精度,所以我不需要使用:”不需要在表中使用隐式数据类型,或者像SQL标准定义的那样在选择中使用隐式强制转换,以获得更高的精度。如果有的话,我从来没有在MySQL中遇到过这种更高精度的设置。
0赞 Raymond Nijland 3/25/2019
此外,我相信这应该是按照 SQL 标准,但 MySQL 和 MariaDB 允许这样做,在某些数据库(如 PostgreSQL)中,SQL Server 它会给出因此不可移植。SELECT (41/99)00SELECT (41/99);
0赞 Jimmix 3/25/2019
@Raymond Nijland,问题不在于浮点数,而在于实现小数的固定精度,因此它不是重复的。
1赞 Raymond Nijland 3/25/2019
接缝有一个MySQL设置,我刚刚在第一个div_precision_increment找到了它

答:

4赞 O. Jones 3/25/2019 #1

MySQL 使用 64 位 IEEE-754 浮点(又名 )进行内部计算,除非您通过强制转换常量来专门让它使用整数或十进制算术。(Javascript 也是如此。DOUBLE

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

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

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

评论

0赞 Jimmix 3/25/2019
你吓到我了:“如果你在计算中依赖于十进制数据类型的准确性,请仔细测试:MySQL真的想在DOUBLE中完成它们”。但是,如果我在 SELECT 中对数据进行操作的任何地方以及 INSERT 之前的任何地方都使用带有 AS DECIMAL 的 CAST,那么我就会被覆盖,并且不会发生任何意外?
0赞 O. Jones 3/25/2019
恕我直言,我本来是想吓唬你的。请非常小心地使用这个 SQL 中的算术应用程序。你可能没事。但是你应该测试用例,比如说服自己你不会失去精度。如果精确度是关键任务,那么你真的应该用强类型语言来做这些事情。10000000000000 + 1
0赞 Raymond Nijland 3/25/2019
顺便说一句,如果MySQL使用内部,我发现了其他东西,为什么如果MySQL会导致它的结果?在可能的情况下,MySQL接缝默认为Precision Math(又名DECIMAL数据类型精度)IEEE-754 floating point (aka DOUBLE) SELECT (0.1 + 0.3) = 0.410