我试图获得相同数量的精度(小数点后的位数),来自执行某些方程式的SELECT的结果。
为简单起见,下面所有示例中的值都是硬编码的,它们可能来自也可能不来自表的列
我正在使用MySQL 8。
如果你运行示例E1
:
-- E1
SELECT (41/99);
-- 0.4141
小数点后你会得到4位数。
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浮点(aka DOUBLE
)进行内部计算,除非您通过强制转换常量使用整数或十进制算法。
显示数字时,尽可能准确地以十进制形式呈现它们。使用DOUBLE
,需要转换为十进制。如果您不想要默认的渲染精度,而是想自己控制它,可以使用ROUND()
或TRUNCATE()
函数。这就是你控制它的方式。
使用这些功能并没有太多的性能损失。许多使用纯SQL的程序员(而不是Java,PHP或其他语言的应用程序检索的SQL)总是使用其中一个函数来保持对渲染的控制。
如果您在计算中依赖于DECIMAL数据类型的准确性,请仔细测试:MySQL确实希望在DOUBLE中执行它们。或者,更好的是,使用强类型语言来获得对算术的精确控制。