提问人:Jimmix 提问时间:3/25/2019 最后编辑:user207421Jimmix 更新时间:5/7/2021 访问量:7326
MySQL SELECT 计算精度(小数点后的数字)
MySQL SELECT Precision of calculation (digits after decimal point)
问:
我正在尝试为来自执行某些方程式的 SELECT 的结果实现相同的精度(小数点后位数)。
- 在性能方面是否有任何区别,在 CAST() 或 ROUND() 之间实现所需的精度的情况下,除了四舍五入最后一个之外,使用良好做法是否有任何区别?有没有更好的选择?
为简单起见,以下所有示例中的值都是硬编码的,它们可能来自表的列,也可能不来自表的列
我正在使用 MySQL 8。
如果运行 example :E1
-- E1
SELECT (41/99);
-- 0.4141
您将在小数点后获得 4 位数字。
是否有任何MySQL设置可以开箱即用地带来更高的精度,因此我不需要使用:
-- E2型 选择 ROUND((41/99), 20); -- 0.41414141400000000000
--或
选择 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 使用 64 位 IEEE-754 浮点(又名 )进行内部计算,除非您通过强制转换常量来专门让它使用整数或十进制算术。(Javascript 也是如此。DOUBLE
显示数字时,它会尽最大努力以十进制形式尽可能准确地呈现它们。使用 ,这需要转换为十进制。如果您不想要默认的渲染精度,而是想自己控制它,则可以使用 ROUND() 或 TRUNCATE()
函数。这就是你控制它的方式。
DOUBLE
使用这些函数不会对性能造成太大影响。许多使用纯 SQL(而不是由 Java、PHP 或其他语言的应用程序检索的 SQL)的程序员总是使用其中一个函数来保持对渲染的控制。
如果你在计算中依赖于DECIMAL数据类型的准确性,请仔细测试:MySQL真的想在DOUBLE中完成它们。或者,更好的是,使用强类型语言来精确控制您的算术。
评论
10000000000000 + 1
IEEE-754 floating point (aka DOUBLE)
SELECT (0.1 + 0.3) = 0.4
1
0
上一个:随机数重新排序的总和合并为重复值
评论
SELECT (41/99)
0
0
SELECT (41/99);