SQL 最多 15 位小数的货币值数据类型
SQL Data type for monetary values with up to 15 decimal places
我需要存储 £0.00005756
、£0.01
、£0.000000000000123
等货币值并进行一些基本计算(主要是乘法)。最大小数位数将是 15,但另一侧也可能有相当大的数字。如果左侧的 0
多于 2 个小数位,则使用的可能性不大,但有可能。我遇到的问题是超过 2 位小数。
我创建了一个测试 table 并插入了一些基本数据。不幸的是,它似乎无法存储非常小的数字。
注意:我将 money2
列创建为 [decimal](18, 4)
列,因为当我研究了货币价值的用途时,这似乎是推荐的。但是,我需要 15 位小数,这就是 money1
存在的原因。
Table创作:
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
returns 结果如下:
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 处),而不是显示实际数字。我认为这只发生在使用估计数字的浮点列并且小数点更准确时?
这只是一个数据类型问题,还是我根本不应该尝试在数据库中解决的问题?
问题出在井号上。这意味着这些值被读取为 money
——精度不够高。所以,你丢失了小数位。
只需删除货币符号:
insert into moneytest (money1, money2)
values (0.000000000000123, 0.000000000000123);
Here 是一个 db<>fiddle.
我需要存储 £0.00005756
、£0.01
、£0.000000000000123
等货币值并进行一些基本计算(主要是乘法)。最大小数位数将是 15,但另一侧也可能有相当大的数字。如果左侧的 0
多于 2 个小数位,则使用的可能性不大,但有可能。我遇到的问题是超过 2 位小数。
我创建了一个测试 table 并插入了一些基本数据。不幸的是,它似乎无法存储非常小的数字。
注意:我将 money2
列创建为 [decimal](18, 4)
列,因为当我研究了货币价值的用途时,这似乎是推荐的。但是,我需要 15 位小数,这就是 money1
存在的原因。
Table创作:
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
returns 结果如下:
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 处),而不是显示实际数字。我认为这只发生在使用估计数字的浮点列并且小数点更准确时?
这只是一个数据类型问题,还是我根本不应该尝试在数据库中解决的问题?
问题出在井号上。这意味着这些值被读取为 money
——精度不够高。所以,你丢失了小数位。
只需删除货币符号:
insert into moneytest (money1, money2)
values (0.000000000000123, 0.000000000000123);
Here 是一个 db<>fiddle.