Decimal 数据计算精度计算规则

结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。 你用精度都为 decimal(38,12) 的两数相乘除,其结果精度都远大于38,因此小数位数被截断.

decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),

它们运算结果的位数有如下算法:





运算			结果精度							结果小数位数

----------------------------------------------------------------

e1 + e2		max(s1, s2) + max(p1-s1, p2-s2) + 1			max(s1, s2)

e1 - e2		max(s1, s2) + max(p1-s1, p2-s2) + 1			max(s1, s2)

e1 * e2		p1 + p2 + 1									s1 + s2

e1 / e2		p1 - s1 + s2 + max(6, s1 + p2 + 1)			max(6, s1 + p2 + 1)

e1 { UNION | EXCEPT | INTERSECT } e2	max(s1, s2) + max(p1-s1, p2-s2)		max(s1, s2)


在本例中,当e1/e2时,结果小数位数取 max(6,s1+p2+1),但s1+p2+1>38,所以为了不截断整数部分,系统取了6.

这就是为什么你把总精度设得那么高,小数部分反而总是6的原因。

参考地址: http://blog.csdn.net/tiger_zhao/article/details/45868793 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104687270e54f7327d818c027fa3cf1fd5791d1c053db2fa3a231206d3c2776000ad5448afad7624385577e6c097db14cabae23f5fff3047000bf64505a213&p=866fdc5b8e934eaf58ed8f2d02149f&newp=817ac64ad48917ff57ed947e5b5293231610db2151d7d7146b82c825d7331b001c3bbfb423231402d6c57e6407ad4e5becf23376340723a3dda5c91d9fb4c57479c271&user=baidu&fm=sc&query=decimal%BE%AB%B6%C8&qid=bc1b497c0001d785&p1=9

转载于:https://my.oschina.net/whiteInfo/blog/810477

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值