一个SQL精度的问题
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
作者: FlySQL 发布时间: 2011-06-13
作者: maco_wang 发布时间: 2011-06-13
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
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
估计是因为超过38了
麻烦能说得再详细点吗!?
大侠 怎么看出超过了38位的呀!?
作者: scmail81 发布时间: 2011-06-13
关于这个问题之前讨论过,建议楼主先参考一下
--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过
能发个链接 详细看看嘛! 谢谢!!
作者: scmail81 发布时间: 2011-06-13
引用 2 楼 maco_wang 的回复:
关于这个问题之前讨论过,建议楼主先参考一下
--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过
能发个链接 详细看看嘛! 谢谢!!
他给的就是一个链接
http://topic.csdn.net/u/20090511/11/b666f243-2457-4a7b-8599-9e7630f85561.html
作者: FlySQL 发布时间: 2011-06-13
SQL code
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),
它们运算结果的位数有如下算法:
运算 结果精度 结果小数位数
---------------------------------------------------------……
作者: htl258 发布时间: 2011-06-13
SQL code
decimal型表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2),
它们运算结果的位数有如下算法:
运算 结果精度 结果小数位数
-------------------------------------------------------------……
++
作者: q107770540 发布时间: 2011-06-13
引用 2 楼 maco_wang 的回复:
关于这个问题之前讨论过,建议楼主先参考一下
--------
由于工作较忙 有段时间没上来过了 你提过之前讨论过
能发个链接 详细看看嘛! 谢谢!!
那句话带链接了.
几年前的帖子居然被翻出来,那时我居然已经2星了...
现在居然刚升3星,进步太慢了啊...
作者: qianjin036a 发布时间: 2011-06-13