2016-09-21 16 views
4

我试图截断双带4位小数,但我得到四舍五入最后一位数字(和双只有4位小数!)MySQL的TRUNCATE(双,4)修改值,而不是截断

双: -2.5805

SELECT TRUNCATE(double, 4) FROM `table` 

结果: -2.5804

更有趣的是:

SELECT TRUNCATE(mycol, 4) AS col1, TRUNCATE(-2.5805, 4) AS col2 
FROM mytable 

回报:

col1 | col2 
--------+-------- 
-2.5804 | -2.5805 

Demo here

回答

3

双数据类型是一个浮点类型,这意味着这些数字不是存储为确切的数字。作为floating point types MySQL的文档解释:

因为浮点值是近似的,而不是存储为准确 值,试图为确切的比较可能导致 问题对待他们。他们也受到平台或实施 依赖关系。

这意味着数字-2.5805不是以double形式存储的确切数字。然而,truncate()函数返回一个精确的数字和精确的数字位数。当-2.5805(如双)膨胀时,第四十进制数是4。

TRUNCATE(-2.5805, 4)表达式返回-2.5805因为MySQL对待numeric literals expressed with fixed number of decimal digits为十进制数据类型,这是一个精确的数据类型。因此,truncate()函数只是简单地返回相同的小数位数。