【发布时间】:2019-08-15 04:52:21
【问题描述】:
我正在尝试为来自执行某些方程式的 SELECT 的结果实现相同的精度(小数点后的位数)。
- 除了最后一个舍入之外,在性能方面是否有任何差异,在 CAST() 或 ROUND() 之间实现所需精度的良好使用实践?有没有更好的选择?
为简单起见,下面所有示例中的值都是硬编码的,它们可能来自也可能不来自表的列
我正在使用 MySQL 8。
如果你运行示例E1:
-- E1
SELECT (41/99);
-- 0.4141
您将得到小数点后 4 位数字。
-
是否有任何 MySQL 设置可以直接带来更高的精度,所以我不需要使用:
-- E2 选择回合((41/99),20); -- 0.41414141400000000000
-- 或
SELECT CAST((41/99) AS DECIMAL(21,20)); -- 0.41414141400000000000
如果用于计算的数据是 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 设置可以直接带来更高的精度,所以我不需要使用:" 不需要使用隐式数据类型在表中或隐式转换中的选择就像 SQL 标准定义的那样以获得更高的精度。如果我从来没有遇到过 MySQL 中的这种更高精度的设置。
-
我也相信
SELECT (41/99)按照 SQL 标准应该是0但 MySQL 和 MariaDB 允许这样做,在 PostgreSQL 等数据库中,SQL Server 会给出0所以SELECT (41/99);不是便携。 -
@Raymond Nijland 问题不是关于浮点数,而是关于实现小数的固定精度,因此它不是重复的。
-
seams 有一个 MySQL 设置,我刚发现它是第一个 div_precision_increment
标签: mysql select precision decimal-point