Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему результаты округления разные?  [new]
Buzzzzer
Member

Откуда:
Сообщений: 6
Написал пример, почему результаты между указанием явных значений и объявленными разные? О_о
declare @Тариф float;
declare @Кол_во float;
set @Тариф = 0.35;
set @Кол_во = 83.3;
select @Тариф, @Кол_во,round(@Тариф * @Кол_во,2),round(0.35*83.3,2) 
26 мар 12, 10:24    [12312610]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Buzzzzer,
тёплое с мягким перепутали
26 мар 12, 10:25    [12312622]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Потому что
select sql_variant_property(@Тариф, 'BaseType'), sql_variant_property(0.35, 'BaseType')
26 мар 12, 10:30    [12312652]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Потому что константы 0.35 и 83.3 вовсе не типа float
26 мар 12, 10:31    [12312659]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
Buzzzzer
Member

Откуда:
Сообщений: 6
Glory
Потому что константы 0.35 и 83.3 вовсе не типа float

Да какая разница float это или нет? Объясните?
Если на пальцах посчитать, то должно быть 29.16, хоть float это, хоть real хоть еще какое число.
26 мар 12, 10:40    [12312727]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Buzzzzer,
BOL
Типы данных float и real называются приблизительными типами данных. Поведение float и real соответствует спецификации IEEE 754 для приблизительных числовых типов данных.

Приблизительные числовые типы данных не хранят точных значений, заданных для многих чисел. Вместо этого они хранят очень хорошее приближение для этих значений. Для многих приложений различие между заданным значением и хранимым приближением несущественно. Однако в некоторых случаях это различие становится ощутимым. По причине приблизительной природы типов данных float и real не используйте их, если требуется точность хранения значений. Например, в финансовых приложениях, в операциях, связанных с округлением, или в проверках на точное равенство. Вместо этого используйте целые типы данных, decimal, money или smallmoney.

Избегайте использования столбцов типов float и real в предложении WHERE, особенно при использовании логических операторов = и <>. Рекомендуется ограничить использование столбцов float и real операциями сравнения > или <.

Спецификация IEEE 754 обеспечивает четыре режима округления: округление к ближайшему, округление вверх, округление вниз и округление к нулю. Microsoft SQL Server использует округление вверх. Все эти режимы гарантируют точность представления, но дают слегка отличающиеся результаты для значений с плавающей точкой. Так как двоичное представление числа с плавающей точкой может использовать множество допустимых схем округления, то это приводит к невозможности точного задания значения с плавающей точкой.

26 мар 12, 10:43    [12312742]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
Buzzzzer
Member

Откуда:
Сообщений: 6
denis2710, спасибо, буду знать....
26 мар 12, 10:45    [12312761]     Ответить | Цитировать Сообщить модератору
 Re: Почему результаты округления разные?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Buzzzzer
Да какая разница float это или нет? Объясните?

Какая разница между результатом дроби 1/6 и число 0.16 ?
26 мар 12, 10:59    [12312893]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить