sql - 为什么 SQL 中没有 ROUND(23/6) = 4?
问题描述
案例 A:当您尝试自己将结果四舍五入到最接近的小数时
SELECT ROUND (3.833333333333333) -- 4
案例 B:当您让 SQL 进行数学运算然后四舍五入到最接近的小数时
SELECT ROUND (23/6) -- 3 (OR CEIL)
在这种情况下,按照操作的顺序:
SQL将括号之间的内容分开,首先= 3.833333333333333
然后(这就是问题所在)它将删除小数点后的所有内容。(自动将其转换为 int)=3.0
现在,让我们对小数进行四舍五入(在上一步中已经删除了!现在它 = 0)
因此,最后的结果将是 (3)。不是(4)。!
即使有转换:
SELECT CAST (DIV (23,6) AS NUMERIC (10,5)) AS tst -- 3.00000
SELECT CAST ((23/6) AS DECIMAL (5,2)) AS tst -- 3.00
SELECT CAST (23/6 AS FLOAT) AS tst -- 3
SELECT CAST (23/6 AS REAL) AS tst -- 3
这个问题有解决方案吗?
解决方案
因为它执行整数除法。然后引擎评估:
ROUND (23/6)
表达式23/6
首先被评估为3
。然后:
ROUND (3)
被评估为3
。
如果你想要浮点精度,你可以乘以1.0
. 例如通过这样做:
ROUND ( 1.0 * 23/6)
推荐阅读
- reactjs - async/await 与 redux 反应
- sql - 不是单组分组函数,在 select 中有聚合函数
- ios - 应用程序在后台模式下仅在 iOS 13 上崩溃
- php - 优化洗牌数组 - 我需要遍历整个数组吗?
- c# - 同步读取 azure service bus QUEUE 消息
- java - 挑选数组中的唯一数字时出错
- python - 修复 Python 中的 CSV 文件读取错误
- dataframe - 使用 mapreduce 读取 CSV(并非所有列都匹配)并合并到 DataFrame
- javascript - 在 Svelte 中的按钮上切换类
- node.js - socket.io 客户端在本机反应中接收对同一事件的多个调用