最多15个小数位的货币值的SQL数据类型

时间:2019-01-08 15:51:03

标签: sql sql-server-2008 sqldatatypes

我需要存储和进行一些货币值的基本计算(大部分是乘法),例如£0.00005756£0.01£0.000000000000123等。小数位数的最大值正在增加到15,但另一端也可能有相当大的数字。如果左侧多于0,则不可能使用多于2个小数位,但有可能。我遇到的数字是当它超过小数点后2位时。

我创建了一个测试表并插入了一些基本数据。不幸的是,它似乎无法存储非常小的数字。

注意:我将money2列创建为[decimal](18, 4)列,因为在研究货币价值使用方法时似乎建议这样做。但是,我需要15个小数位,这就是money1存在的原因。

表创建:

  CREATE TABLE [dbo].[MoneyTest](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [money1] [decimal](18, 15) NULL,
        [money2] [decimal](18, 4) NULL,
     CONSTRAINT [PK_uMoneyTest] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

insert into moneytest 
(money1, money2) values
(£0.01,£0.01)

insert into moneytest 
(money1, money2) values
(£0.000000000000123,£0.000000000000123)

insert into moneytest 
(money1, money2) values
(£0.00005756,£0.00005756)

select * from moneytest返回以下结果:

id  money1              money2
7   0.010000000000000   0.0100
8   0.000000000000000   0.0000
9   0.000100000000000   0.0001

我一直期待这些结果:

id  money1              money2
7   0.010000000000000   0.0100
8   0.000000000000123   0.0000
9   0.000575600000000   0.0001

尤其是,行ID 9似乎四舍五入为1(在小数点4)而不是显示实际数字。我认为这仅在使用估计数字的浮点列时发生,而该十进制数会更准确吗?

这仅仅是数据类型问题,还是我根本不应该尝试在数据库中解决的问题?

1 个答案:

答案 0 :(得分:3)

问题是英镑符号。这意味着这些值将被读取为money-精度不够高。因此,您将失去小数位。

只需删除货币符号:

insert into moneytest (money1, money2)
    values (0.000000000000123, 0.000000000000123);

Here是db <>小提琴。