进入数据库时​​小数取整

时间:2019-03-31 15:41:30

标签: c# sql database decimal

我正在尝试将一个十进制值上传到数据库中。

在上传之前(调试C#时),它是十进制,但是当插入数据库时​​,它是十进制四舍五入的,因此在小数点后没有数字,而是零。为什么?

变量声明:

decimal screen_size = 0;
cmd.Parameters.Add(new SqlParameter("@devicename", SqlDbType.NVarChar));
cmd.Parameters.Add(new SqlParameter("@batterylife", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@price", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@BasemarkX", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@ImageURL", SqlDbType.VarChar, int.MaxValue));
cmd.Parameters.Add(new SqlParameter("@year", SqlDbType.Int)); 
cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Int));

分配:

screen_size = decimal.Parse(Regex.Match(screenSize, @"\d+(\.\d+)?").Value);

上传:

cmd.CommandText =
   "UPDATE Phones " +
   "SET price = @price, BasemarkX = @BasemarkX, year = @year, batterylife = @batterylife, screensize = @screensize " +
   "WHERE devicename = @devicename";

    //set parameters values
    cmd.Parameters["@devicename"].Value = model;
    cmd.Parameters["@batterylife"].Value = batterylife;
    cmd.Parameters["@price"].Value = price;
    cmd.Parameters["@BasemarkX"].Value = bench;
    cmd.Parameters["@year"].Value = year;
    cmd.Parameters["@ImageURL"].Value = imgURL;
    cmd.Parameters["@screensize"].Value = screen_size;

    cmd.ExecuteNonQuery();

数据库:

CREATE TABLE [dbo].[Phones] (
[Id]          INT             IDENTITY (1, 1) NOT NULL,
[devicename]  NVARCHAR (50)   NULL,
[batterylife] INT             DEFAULT ((0)) NULL,
[price]       INT             DEFAULT ((0)) NULL,
[BasemarkX]   INT             DEFAULT ((0)) NULL,
[year]        INT             DEFAULT ((0)) NULL,
[ImageURL]    NVARCHAR (MAX)  NULL,
[screensize]  DECIMAL (18, 4) DEFAULT ((0)) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

说明:我正在尝试上传一个十进制数字,该数字通常在点的最大两端各为一位,在每一侧最多为两位(不起作用的测试是在每一端只有一位)

3 个答案:

答案 0 :(得分:2)

您的screensize变量是DECIMAL (18, 4)。因此,它最多可以容纳18位数字,并且允许您在浮点数后有4位数字,并且如果您有更多的浮点数,则将四舍五入。

答案 1 :(得分:1)

理解SQL中的十进制类型背后的工作至关重要。以DECIMAL(size,d)作为大小,确定值的总长度,包括浮点后的数字。例如,如果您的值是'500000.00',而十进制(8,2)表示您只能有一个总共8位数字,小数点后只能输入2位数字。

在您的情况下,参数大小为DECIMAL(18,4),这意味着如果一个数字的位数大于sql server将被截断的位数,则只允许使用4个浮点数字。

答案 2 :(得分:0)

此问题是由您对参数@screensize的定义引起的
您已将其声明为SqlDbType.Int类型,即使您可以将参数的Value属性设置为其他类型的值(如十进制),当您将该参数发送给数据库引擎时,它也会四舍五入为最接近的整数,您会在数据库表中看到该值。

使用参数时,最重要的是为它们提供数据库表中期望的数据类型。

将该参数声明为

cmd.Parameters.Add(new SqlParameter("@screensize", SqlDbType.Decimal));