MaxCompute字段A,B, C, D 类型都是 decimal(18,2)是怎么产生的?

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结果,小数位会被放大, 大佬们 有时间可以看是啥情况?

展开
收起
真的很搞笑 2023-03-14 17:32:29 385 分享 版权
2 条回答
写回答
取消 提交回答
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    计算两个 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;
    
    
    2023-03-14 17:53:28
    赞同 展开评论
  • 月移花影,暗香浮动

    这是因为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。

    2023-03-14 17:38:46
    赞同 展开评论

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

收录在圈子:
MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您可以经济并高效的分析处理海量数据。数以万计的企业正基于 MaxCompute 进行数据计算与分析,将数据高效转换为业务洞察。
还有其他疑问?
咨询AI助理