DECLARE @test DECIMAL(38, 8), @test2 DECIMAL(28, 8)
SET @test = 123.05468800
SET @test2 = 123.05468800
SELECT
@test as test,
FLOOR(@test) AS floortest,
@test-FLOOR(@test) AS broken,
@test - CAST(FLOOR(@test) AS DECIMAL(38, 8)) AS fixed
INTO gbntest;
SELECT
@test2 as test,
FLOOR(@test2) AS floortest,
@test-FLOOR(@test2) AS working
INTO gbntest2;
SELECT
123.05468800 as test,
FLOOR(123.05468800) as floortest,
123.05468800 - FLOOR(123.05468800) as working
INTO gbntest3;
SELECT * FROM INFORMATION_SCHEMA.COLUMNS C WHERE C.TABLE_NAME LIKE 'gbntest%';
DROP TABLE gbntest;
DROP TABLE gbntest2;
DROP TABLE gbntest3;
Обратите внимание, что средние 2 для gbntest decimal (38,0)
Однако, с константами или decimal (28,8)
это работает.То же самое происходит с (29,8)
и (30,8)
Но затем с (31,8)
вы получаете (38,7)
назад.
MSDN "Точность, масштаб и длина" описывает, почему
precision scale
...
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
Для (31,8) вы получаете точность (40, 8)
max(8,0) + max(31-8, 31-0) + 1 -> 8 + 31 + 1 -> 40
max(8,0) -> 8
(40,8)
, если уменьшитьдо (38,6)
.Так что я где-то обманул мои вычисления :-) но я надеюсь, что вы поняли ...