请问一下 MySQL 中非表查询时的小数是浮点书还是定点数?
比如 select 0.1
或者 select format('0.1',2)
或者 select round('0.1',2)
或者其他情况?
我自己测试似乎 format 的结果是浮点数,用select format('0.1',2) + 0.2
返回结果是 0.30000000000000004
其他方式似乎都能正确计算出 0.3
1
publicly 2022-03-04 14:42:47 +08:00
你数据库字段的类型是什么
|
2
XiaoxiaoPu 2022-03-04 14:58:20 +08:00
|
3
qwerthhusn 2022-03-04 15:36:24 +08:00 1
几个要点理解了你就大概知道了
1. 字面量,你在 SQL 里面写的数字 MySQL 处理的时候会变成特定的类型,例如 2.0 其实是一个 DECIMAL ,2.0e0 其实是一个 REAL 2. MySQL 在运算表达式或者处理函数入参的时候,会尽量帮你自动转换类型。 分析一下你说的这个 select format('0.1'', 2) + 0.2 1. format 函数的第一个入参是个数字,文档中没有说明到底是 int 还是 decimal 还是 real ,反正入参是一个数字,但是你传了个'0.1'字符串,那他自动帮你转换成数字并带入 format ,然后返回的结果是个字符串'0.10' 2. 然后是 select '0.10' + 0.2 ,你拿着字符串和 DECIMAL 相加,从结果反推,'0.10'被 MySQL 转成了 REAL ,REAL 与 DECIMAL 相加,那 MySQL 也把 0.2 变成了 REAL ,所以两个 REAL 加在一起就是想要的结果 MySQL 其实帮你做了很多的隐含的转换操作,我觉得也没有必要深究,如果出问题的时候直接显示 cast 一下就行了 比如 select cast(format('0.1', 2) as decimal(10, 1)) + 0.2 就是 0.3 了 |
4
cheng6563 OP @qwerthhusn 感谢回复,山里在用存储过程记账,落库还用的是 varchar ,format 用了一堆就是没用 cast ,居然也没反馈问题。。。搞的我改点东西都不知怎么下手。。。
|