MaxCompute字段A,B, C, D 类型都是 decimal(18,2)是怎么产生的? E = (A + B) / C, 此时算出来的E的类型还会是 decimal(18,2) F = (A + B) / (C +D) ,此时算出来的F的类型会是 decimal(18,N), N会大于2, 不知道为啥会产生这种情况,猜测是分母有加减时 ,算出来的decimal结果,小数位会被放大, 大佬们 有时间可以看是啥情况?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
计算两个 decimal 类型的数值时,其结果的小数位数是由它们的 decimal(p1,s1) 和 decimal(p2,s2) 类型定义的。结果的小数位数是 max(s1,s2)。
在这种情况下,decimal 类型的精度会随着操作而改变,当分母存在加减运算时,结果的 decimal 类型的小数位数可能会更大。
例如,计算 (1.23 + 4.56) / 7.89,小数点后的位数为2。但是,计算 (1.23 + 4.56) / (7.89 + 0.01),小数点后的位数可能会超过2。
为了避免这种情况,可以通过在 SQL 中使用 CAST 将 DECIMAL 类型转换为特定的精度和小数位数。例如,在计算 F = (A + B) / (C + D) 时,可以使用以下语句:
SELECT CAST((A + B) / (C + D) AS DECIMAL(18,2)) AS F FROM mytable;
这是因为SQL Server在执行除法时,会根据计算的精度与列的数据类型来确定结果的精度和数据类型。在这种情况下,两个decimal(18,2)类型的数据相加可能会产生一个比原来的2位小数更多的位数。当计算结果过长时,SQL Server会将结果设置为一个新的decimal类型并自动指定它的精度和小数位数。
例如,假设有两个decimal(18,2)类型的数字:15.25和23.45。它们的和等于38.70。另外两个相加的数字也是decimal(18,2)类型,并且它们的和等于40.00。以下是计算过程:
38.70 / 40.00 = 0.9675
在这种情况下,由于除法产生的结果是一个小数,SQL Server需要决定结果的精度和小数位数。它会使用以下公式:
Result precision = precision of numeric(18,2) + precision of numeric(18,2) + 1 Result scale = maximum scale of numeric(18,2) and numeric(18,2)
应用这个公式,我们得到:
Result precision = 18 + 18 + 1 = 37 Result scale = maximum(2, 2) = 2
因此,结果的类型是decimal(37,2),它保留了37位数字和2位小数。这解释了为什么结果数据小数位数会大于2。
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。