MySQL 关于定点数浮点数问题

2022-03-04 14:28:25 +08:00
 cheng6563

请问一下 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

1542 次点击
所在节点    MySQL
4 条回复
publicly
2022-03-04 14:42:47 +08:00
你数据库字段的类型是什么
XiaoxiaoPu
2022-03-04 14:58:20 +08:00
qwerthhusn
2022-03-04 15:36:24 +08:00
几个要点理解了你就大概知道了
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 了
cheng6563
2022-03-04 15:55:37 +08:00
@qwerthhusn 感谢回复,山里在用存储过程记账,落库还用的是 varchar ,format 用了一堆就是没用 cast ,居然也没反馈问题。。。搞的我改点东西都不知怎么下手。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX