结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。
你用精度都为 decimal(38,12) 的两数相乘除,其结果精度都远大于38,因此小数位数被截断.
你用精度都为 decimal(38,12) 的两数相乘除,其结果精度都远大于38,因此小数位数被截断.
解决方案 »
- 这个SQL还能怎么优化吗
- 触发器的触发机制是什么?
- 老题
- 请问数据库高手,如何备份一个表
- 请大家说说存储过程中有关sql语句长度的问题
- 邹建)大哥请进!(一个表,根据其中二列情况求数据。)
- [这个存储怎么写]从表里返回符合某个条件的结果集,并且把表里那些在结果集中的记录的字段A设为1
- 请教:ASP中如何写连接到SQL数据库的命令字符
- (vfp6.0)如何在程序中实现对表中图象的更新,例如添加\删除\更改图片.要用什么方法?
- Informix Online 性能问题
- 疑难问题 SQL语句求助!
- SQLServer数据库同步总报错:为过程或函数 sp_MSset_subscription_properties 指定的参数太多。
set @t1 = 3.00000000001
set @t2 = 100.00000000001
还要考虑你可能的
set @t1 =99999999999999999999999999.00000000001
set @t2 = 100.00000000001
declare @t1 decimal(25,12),@t2 decimal(25,12) set @t1 = 3.00000000001 set @t2 = 100.00000000001 select @t2/@t1 --33.3333333332255select @t2 + @t1 --103.000000000020select @t2 * @t1 --300.00000000103
它们运算结果的位数有如下算法:
运算 结果精度 结果小数位数
----------------------------------------------------------------
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的原因。