sql server中的decimal或者numeric的精度问题

时间:2021-04-03 16:34:54

何谓精度:最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。 
小数位数:小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此,0 <= s <= p。最大存储大小基于精度而变化。 
在c sharp中调用传递SqlParameter参数时也需要制定参数的精度和小数的位数,如下面的例子声明一个精度为18小树位数为2的decimal类型参数: 

复制代码代码如下:
SqlParameter parm = new SqlParameter("@parmName", SqlDbType.Decimal); 
parm.Precision = 18; 
parm.Scale = 2;
 
                                 Dim RSParm As SqlParameter = Adapter.UpdateCommand.Parameters.Add("@RSGrowth", SqlDbType.Decimal, 18, "RSGrowth")
Dim RmRevParm As SqlParameter = Adapter.UpdateCommand.Parameters.Add("@RmRevGrowth", SqlDbType.Decimal, 18, "RmRevGrowth")

With Adapter.UpdateCommand.Parameters
.Add("@ID", SqlDbType.Int, 10, "ID").SourceVersion = DataRowVersion.Original
RSParm.Precision = 18
RSParm.Scale = 15
RSParm.SourceVersion = DataRowVersion.Current

RmRevParm.Precision = 18
RmRevParm.Scale = 15
RmRevParm.SourceVersion = DataRowVersion.Current
.Add("@ModifiedBy", SqlDbType.Int, 5, "ModifiedBy").SourceVersion = DataRowVersion.Current
.Add("@ModifiedDate", SqlDbType.DateTime, 22, "ModifiedDate").SourceVersion = DataRowVersion.Current

  • Input value is 99.9:

 

========================================================================
            using (SqlConnection conn = new SqlConnection(connStr))

            {

                conn.Open();

                SqlCommand cmd = new SqlCommand("INSERT INTO [NumericTest] VALUES (@ID, @NumericValue)", conn);

                SqlParameter p1 = new SqlParameter("ID", SqlDbType.Int);

                SqlParameter p2 = new SqlParameter("NumericValue", SqlDbType.Decimal);

                p1.Value = 2;

                p2.Precision = 3;

                p2.Scale = 0;

                p2.Value = 99.9;

                cmd.Parameters.Add(p1);

                cmd.Parameters.Add(p2);

                int result = cmd.ExecuteNonQuery();
            }

 

 

,new SqlParameter("@Password", SqlDbType.Decimal,18,ParameterDirection.Input,true,9,2,"",DataRowVersion.Current,model.Password)//