一个SQL精度的问题

SQL code

Select 2.0000000568*10.0000000000   --=20.00000056800000000000

Create table T
(
   T1  decimal(28,10),
   T2  decimal(28,10)
)

insert T select 2.0000000568,10.0000000000

--语句1
Select T1* T2 from T   --=20.000001


--语句2
Select Cast(T1 as decimal(28,15))*Cast(T2 as decimal(28,15)) from T  --=20.00000056800



我想问一下 我T1跟T2都是decimal(28,10) 为什么单纯的相乘后(语句一)后面的小数位给截断了呢
为什么语句2就对了呢!??

作者: scmail81   发布时间: 2011-06-13

估计是因为超过38了

作者: FlySQL   发布时间: 2011-06-13

关于这个问题之前讨论过,建议楼主先参考一下

作者: maco_wang   发布时间: 2011-06-13

SQL code
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的原因。

我觉得蓉儿说的很到位。

作者: maco_wang   发布时间: 2011-06-13

现站着板凳再说

作者: chuanzhang5687   发布时间: 2011-06-13

SQL code
Create table T
(
   T1  decimal(18,10),
   T2  decimal(18,10)
)

insert T select 2.0000000568,10.0000000000

--语句1
Select T1* T2 from T 
/**

---------------------------------------
20.00000056800000000000

(1 行受影响)
**/

作者: FlySQL   发布时间: 2011-06-13

引用 1 楼 flysql 的回复:
估计是因为超过38了

麻烦能说得再详细点吗!?
大侠 怎么看出超过了38位的呀!?

作者: scmail81   发布时间: 2011-06-13

引用 2 楼 maco_wang 的回复:

关于这个问题之前讨论过,建议楼主先参考一下

--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过 
能发个链接 详细看看嘛! 谢谢!!

作者: scmail81   发布时间: 2011-06-13

引用 7 楼 scmail81 的回复:
引用 2 楼 maco_wang 的回复:

关于这个问题之前讨论过,建议楼主先参考一下

--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过
能发个链接 详细看看嘛! 谢谢!!


他给的就是一个链接
http://topic.csdn.net/u/20090511/11/b666f243-2457-4a7b-8599-9e7630f85561.html

作者: FlySQL   发布时间: 2011-06-13

引用 3 楼 maco_wang 的回复:
SQL code
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),
它们运算结果的位数有如下算法:


运算 结果精度 结果小数位数
---------------------------------------------------------……
UP,这个琢磨透了就差不多了

作者: htl258   发布时间: 2011-06-13

引用 3 楼 maco_wang 的回复:

SQL code
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),
它们运算结果的位数有如下算法:


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

++

作者: q107770540   发布时间: 2011-06-13

引用 7 楼 scmail81 的回复:
引用 2 楼 maco_wang 的回复:

关于这个问题之前讨论过,建议楼主先参考一下

--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过
能发个链接 详细看看嘛! 谢谢!!


那句话带链接了.
几年前的帖子居然被翻出来,那时我居然已经2星了...
现在居然刚升3星,进步太慢了啊...

作者: qianjin036a   发布时间: 2011-06-13