Sql Server Decimal (30,10) теряет последние 2 десятичных знака - PullRequest
12 голосов
/ 21 сентября 2009

Когда на Sql Server 05 делятся 2 десятичных (30,10) числа, кажется, что последние 2 десятичных знака теряются (даже не округляются, а просто усекаются).

Например:

Declare @x decimal(30,10)
Declare @y decimal(30,10)
Declare @z decimal(30,10)

select @x = 2.1277164747 
select @y = 4.8553794574

Select @z = @y/@x   
select @z 

Результат: 2.28196731 00

Но если 2 числа, которые делятся, конвертируются в число с плавающей точкой, это похоже на работу:

....
Select @z = cast(@y as float)/cast(@x as float)
select @z 

Результат: 2.28196731 81

Почему Sql делает это? И как правильно делить десятичные дроби без потери точности в Sql.

Ответы [ 2 ]

20 голосов
/ 21 сентября 2009

Максимально допустимая точность в SQL Server - 38. Вы используете десятичное число (30,10). Максимальное значение равно 99,999,999,999,999,999,999,9999999999, если вы разделите это число на 0,000000001, в результате вы получите еще большее число, поэтому результирующий тип данных должен быть в состоянии его вместить. Это приводит к потере точности.

Измените исходные типы данных на десятичные (20,10), и эта проблема не возникает.

Полные правила, касающиеся типов данных (и того, как на них влияют математические операции):

Полные правила здесь

0 голосов
/ 21 сентября 2009

Короче говоря, используйте кастинг, чтобы гарантировать свои результаты. Когда вы присваиваете @x и @y литеральным значениям, они, вероятно, принимают точность этих литералов. Это помогает объяснить, почему деление на эти значения не соответствует вашим ожиданиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...