if exists (select 1 from sys.tables where name = 'd_ratio') begin drop table d_ratio end
if exists (select 1 from sys.tables where name = 'elrd') begin drop table elrd end
CREATE TABLE [dbo].[d_ratio](
[index] [bigint] NULL,
[Class] [bigint] NULL,
[Dratio] [float] NULL,
[ELR-Act1] [float] NULL,
[ELR-Act2] [float] NULL
) ON [PRIMARY]
GO
Insert into D_ratio
select 0,2503,0.285,0.75,1.33
CREATE TABLE [dbo].[ELRD](
[RATE_EFFDT] [date] NOT NULL,
[CLASS] [varchar](4) NOT NULL,
[ELR] [decimal](5, 2) NULL,
[D_RATIO] [decimal](5, 2) NULL,
[EXPO_ACT] [char](2) NOT NULL
) ON [PRIMARY]
GO
truncate table elrd
insert into elrd(Rate_effdt, class, elr, d_ratio, EXPO_ACT)
select getdate(), right('0000' + cast(class as varchar(10)),4), round(cast([ELR-Act1] as decimal(10,3)),2),Dratio, 1
from d_ratio
select Dratio, * from d_ratio
select D_ratio, * from elrd
输入为 0.285,输出为 0.28。
但是,如果我将其转换为精度为 3 点的小数,如下所示:
truncate table elrd
insert into elrd(Rate_effdt, class, elr, d_ratio, EXPO_ACT)
select getdate(), right('0000' + cast(class as varchar(10)),4), round(cast([ELR-Act1] as decimal(10,3)),2), cast(dratio as decimal(10,3)), 1
from d_ratio
它以 0.285 的形式输入,以 0.29 的形式输出 - 它被正确地四舍五入。
问题SQL Server 在做什么?它是截断浮点数和舍入小数吗?
阅读 SQL Server 手册,数据库似乎在后台使用 IEEE
float
。因此,众所周知会发生“奇怪的事情”。
请参阅 SQLite 中的此常见问题解答(我怀疑它也适用于此处):
(16) 为什么 ROUND(9.95,1) 返回的是 9.9 而不是 10.0?9.95不应该四舍五入吗?