2014-01-16 2 views
3

Почему, когда я:Разделить десятичное по десятичной и получить нулевой

select CAST(1 AS DECIMAL(38, 28))/CAST(1625625 AS DECIMAL(38, 28)) 

Могу ли я получить 0, но когда я

select CAST(1 AS DECIMAL(20, 10))/CAST(1625625 AS DECIMAL(20, 10)) 

я получаю значение?

Я бы ожидал, что деление более высокой точности вернет результат с более высокой точностью, почему это не так?

+1

Я попробовал его с помощью оракула, и они оба вернули правильное значение. –

+1

Обновлен вопрос - Это SQL-Server, мой плохой. Upvoted :) – Faraday

+0

Ничего не поделаешь. десятичная (38, 28) полезна на территории с плавающей точкой, а номера FP не точны. Десятичные числа являются «управляемыми» числами с плавающей запятой и (20, 10) находятся примерно в пределах диапазона управления, в то время как (38, 24) определенно нет! Вот как работают номера FP ... Оформить первый ответ на http://stackoverflow.com/questions/21162624/indexing-float-values-in-python - первый ответ дает хороший обзор. –

ответ

3

Это происходит потому, что для математических операций в результате точность и масштаб рассчитывается с правилами, найденных в http://msdn.microsoft.com/en-us/library/ms190476.aspx#division

операции
E1/E2

результат прецизионного
p1 - ​​s1 + s2 + max (6, s1 + p2 + 1)

результат шкала
макс (6, s1 + р2 + 1)

Так при использовании decimal(38/28) для обеих частей, то в итоге вы с decimal(105,67), который не поддерживается, так что оборваны.

также со ссылкой на

В результате точность и масштаб имеют абсолютный максимум 38. Когда результат точность больше, чем 38, соответствующий масштаб уменьшается, чтобы предотвратить неотъемлемую часть в результате от усечения.

1

В качестве альтернативы вы всегда можете сделать это вместо того, чтобы

SELECT CONVERT(DECIMAL(38,28), 1/1625625.0) 

SELECT CONVERT(DECIMAL(10,10), 1/1625625.0) 

SELECT CONVERT(DECIMAL(38,28), 1.0/1625625) 

SELECT CONVERT(DECIMAL(10,10), 1.0/1625625) 

Все 4 запросов приведет к тому же результату. если вы не ставите .0 на одну из двух частей, он будет рассматривать как целочисленное деление, и только результат будет преобразован в десятичный.

Смежные вопросы