在MySQL中,将1转换为十进制返回0.9999而不是1.0000

Zac*_*ack 5 mysql casting

在MySQL中将1转换为十进制时,我期待1.0000,但输出是0.9999.

到底发生了什么?

SELECT CAST(1 AS DECIMAL(4,4))
Run Code Online (Sandbox Code Playgroud)

sha*_*t00 5

MySQL将转换后的值剪切为适合目标类型的最大值.A decimal(4, 4)不会在小数点左侧分配任何有效数字.

仅当服务器未运行严格模式时,此强制转换才会导致溢出,如文档中所述.


Ant*_*han 3

超出范围

例如,DECIMAL(5,2) 存储任何具有五位数字和两位小数的值,其范围从 -999.99 到 999.99。

SELECT CAST(1 AS DECIMAL(5,4)) -> 1.0000
SELECT CAST(1 AS DECIMAL(4,3)) -> 1.000
SELECT CAST(0.0001 AS DECIMAL(4,4)) -> 0.0001
SELECT CAST(0.00001 AS DECIMAL(4,4)) -> 0.0000
SELECT CAST(12345 AS DECIMAL(5,4)) -> 9.9999
Run Code Online (Sandbox Code Playgroud)

更多信息:

https://dev.mysql.com/doc/refman/5.7/en/ precision -math-decimal -characteristics.html https://dev.mysql.com/doc/refman/5.7/en/fixed-point-types .html