问一个MSSQL2000的Decimal运算精度问题(100分)

  • 主题发起人 主题发起人 aKnightChen
  • 开始时间 开始时间
A

aKnightChen

Unregistered / Unconfirmed
GUEST, unregistred user!
我的小系统中,打算金额保留9位运算精度,
因此,我定义为:DECIMAL(24,9)

但,好像MSSQL只运算6位精度。
如下:

declare @a decimal(18,2)
declare @b decimal(18,4)
declare @c decimal(18,8)
declare @d decimal(18,10)

set @a=1.23
set @b=1.2345
set @c=1.23456745

set @d=@a*@b*@c
select @d
-- MSSQL运算结果为:1.8746100000

select 1.23*1.2345*1.23456745
-- MSSQL运算结果为(可能当成Float来算): 1.87461042594075

请问一下,想要保留9位精度,又想是DECIMAL,应如何操作?
小弟先谢谢各位大哥了!
 
下表定义了当运算的结果是 decimal 类型时,结果的精度和小数位数是如何计算的。当以下情况时,结果是 decimal 类型:

两个表达式是 decimal 类型。


一个表达式是 decimal 类型,而另一个是比 decimal 优先顺序低的数据类型。
操作数表达式由表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2)来表示。非 decimal 类型的表达式的精度和小数位数,是对此表达式数据类型定义的精度和小数位数。

操作 结果精度 结果小数位数 *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) 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)

呵呵,从网上找了一段:
http://faq.csdn.net/read/211930.html
 
set @d=Cast(@a as Decimal(18,10))*Cast(@b as decimal(18,10))*Cast(@c as decimal(18,10))
select @d
--MSSQL结果为 1.8746104259
 
数据库中,我改为FLOAT字段了。这样,比较精确。
 
我一般都是在前台程序进行运算,然后再取位,再保存。
否则不只是数据库,连CPU计算精度都有问题。
 
多人接受答案了。
 
后退
顶部