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
Ele entra como 0,285 e sai como 0,28.
No entanto, se eu lançar como um decimal com 3 pontos de precisão assim:
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
Entra como 0,285 e sai como 0,29 - é arredondado corretamente.
Pergunta O que o SQL Server está fazendo? Está truncando floats e arredondando decimais?
Lendo o manual do SQL Server, parece que o banco de dados está usando um IEEE
float
sob o capô.Como tal, sabe-se que "coisas estranhas" acontecem.
Veja este FAQ do SQLite (suspeito que se aplica aqui também):
(16) Por que ROUND(9.95,1) retorna 9,9 em vez de 10,0? 9,95 não deveria arredondar?