YuriyRR
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору declare @num1 numeric(38,10) declare @num2 numeric(38,10) set @num1 = .0000006 set @num2 = 1.0 select cast( @num1 * @num2 as numeric(38,10)) Дает: .0000010000 Вместо: .0000006000 (смотри Precision, Scale и Length) определяет следующие правила для арифметических операций c числами типа NUMERIC: Операция Точность результата Масштаб результата * e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2) e1 * e2 p1 + p2 + 1 s1 + s2 e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1) e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2) В нашем случае точность и масштаб умножения вычисляется так: Точность = P1 + P2 + 1 = 38 + 38 + 1 = 77 Масштаб = S1 + S2 = 10 + 10 = 20 Соответственно, результатом должно быть число типа numeric(77, 20), что не допускается. Вот где нам понадобится сноска: * Точность и масштаб результата имеет абсолютный максимум 38. Если точность результата превышает 38, соответствующий масштаб уменьшается, чтобы предотвратить усечение целой части результата. | Всего записей: 518 | Зарегистр. 07-06-2007 | Отправлено: 14:50 12-03-2014 | Исправлено: YuriyRR, 14:53 12-03-2014 |
|