能否将decimal类型值存入number列?1/12计算结果存储问题咨询
decimal类型值存入number(float)列的解决方案
原有代码失效原因
你当前执行插入未得到预期结果,核心问题是整数除法优先级高于类型转换:SQL中两个INT类型的数值执行除法运算时,会默认走整数除法规则,1/12会先被计算为整数0,后续不管转decimal还是float,最终结果都只能是0,和你预期的0.083不符。
可行实现方案
- 方案1:显式转换运算数类型,规避整数除法
先将参与运算的其中一个INT值转换为decimal类型,再做除法运算,就能得到正确的小数结果:
-- 按需保留3位小数,转float存入对应列 INSERT INTO test VALUES(1, 12, CAST(CAST(1 AS DECIMAL(9,3))/12 AS FLOAT));
- 方案2:隐式转换运算数类型,写法更简洁
直接给整数补小数点和0,SQL会自动将其识别为浮点类型,不会触发整数除法,搭配ROUND函数可以固定保留三位小数:
INSERT INTO test VALUES(1, 12, ROUND(1.0/12, 3));
补充建议
如果你对数值精度要求极高,不建议使用float类型存储该数值:float属于近似数值类型,存储时可能出现精度丢失的问题。这类场景建议先将表的number列修改为精确的decimal类型,插入逻辑会更简单:
-- 修改列类型为精确decimal类型(按需调整精度) ALTER TABLE test MODIFY COLUMN number DECIMAL(9,3); -- 直接插入计算结果即可 INSERT INTO test VALUES(1, 12, 1/12);
内容的提问来源于stack exchange,提问作者Mahendran V M
相关产品推荐
相关产品推荐

