您的位置:首页 > 其它

Decimal 数据计算精度计算规则

2016-12-22 00:00 211 查看
结果精度和小数位数的绝对最大值为 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Decimal 精度问题