【问题标题】:SQL Data type for monetary values with up to 15 decimal places最多 15 位小数的货币值的 SQL 数据类型
【发布时间】:2019-06-03 08:26:27
【问题描述】:

我需要对 £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

特别是,第 9 行似乎四舍五入到 1(在小数点 4 处),而不是显示实际数字。我认为这只发生在使用估计数字的浮点列并且小数意味着更准确时?

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

【问题讨论】:

    标签: sql sql-server-2008 sqldatatypes


    【解决方案1】:

    问题是井号。这意味着这些值被读取为money——精度不够高。所以,你正在丢失小数位。

    只需去掉货币符号:

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

    Here 是一个 dbfiddle。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 2016-04-20
      • 2015-11-21
      • 2012-10-13
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多