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

问题描述 投票:0回答:1

我试图获得相同数量的精度(小数点后的位数),来自执行某些方程式的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

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

mysql select precision decimal-point
1个回答
2
投票

MySQL使用64位IEEE-754浮点(aka DOUBLE)进行内部计算,除非您通过强制转换常量使用整数或十进制算法。

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

使用这些功能并没有太多的性能损失。许多使用纯SQL的程序员(而不是Java,PHP或其他语言的应用程序检索的SQL)总是使用其中一个函数来保持对渲染的控制。

如果您在计算中依赖于DECIMAL数据类型的准确性,请仔细测试:MySQL确实希望在DOUBLE中执行它们。或者,更好的是,使用强类型语言来获得对算术的精确控制。

© www.soinside.com 2019 - 2024. All rights reserved.