我正在尝试为执行某些方程式的SELECT取得相同的精度(小数点后的位数)。
为简单起见,下面所有示例中的值都是硬编码的,它们可能来自表列,也可能不来自表列
我正在使用MySQL 8。
如果您运行示例E1
:
-- E1
SELECT (41/99);
-- 0.4141
小数点后将显示4位数字。
是否有任何可以立即带来更高精度的MySQL设置,所以我不需要使用:
-E2 SELECT ROUND((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
对于我来说,避免浮点数据类型非常重要,因为它们的十进制近似值。如果数据来自表列,则该列将为十进制数据类型。但是用于计算的数据也可能被硬编码。
答案 0 :(得分:2)
MySQL使用64位IEEE-754浮点(也称为DOUBLE
)进行内部计算,除非通过强制转换常量明确使用整数或十进制算术。
在显示数字时,最好将其尽可能精确地显示为十进制。对于DOUBLE
,需要转换为十进制。如果您不想使用默认的渲染精度,而是想自己控制它,则可以使用ROUND()
或TRUNCATE()
函数。这就是您的控制方式。
使用这些功能不会对性能造成太大影响。许多使用普通SQL(而不是用Java,PHP或其他语言的应用程序检索的SQL)的程序员总是使用其中一个功能来保持对渲染的控制。
请仔细测试您是否在计算中依赖DECIMAL数据类型的准确性:MySQL确实希望以DOUBLE的方式进行处理。或者,更好的是,使用强类型语言来精确控制您的算术。