Ошибка округления числа в SQL Server

Я пытаюсь использовать SQL Server 2008 R2 и SQL Server 2012, и я получаю одинаковые результаты в обоих.

Если я напишу следующее утверждение:

select round(4.005, 2)

Я получаю ожидаемый результат: 4.01

Однако, если я напишу следующие утверждения:

declare @result float
select @result = 4.005
select round(@result, 2)

Я получаю неожиданный результат: 4

Но если я заменил float на реальный в предыдущих операциях:

declare @result real
select @result = 4.005
select round(@result, 2)

Я получаю ожидаемый результат.

Может ли кто-нибудь сказать мне, почему это происходит?

0
nl ja de

2 ответы

потому что вы не указали количество бит, которые используются для хранения мантиссы числа с плавающей точкой в ​​научной нотации, попробуйте это,

declare @result float(5)
select @result = 4.005
select round(@result, 2)
1
добавлено
это работает, потому что float (5) = real (это то, что говорит Books Online), если вы не укажете значение, тогда по умолчанию используется 53, поэтому, если вы попытаетесь с любым значением, большим, чем 24, он терпит неудачу. Зачем?
добавлено автор vcRobe, источник

Это связано с тем, что float является приблизительным типом данных.

see: http://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

The float and real data types are known as approximate data types. The behavior of float and real follows the IEEE 754 specification on approximate numeric data types. Approximate numeric data types do not store the exact values specified for many numbers; they store an extremely close approximation of the value. For many applications, the tiny difference between the specified value and the stored approximation is not noticeable. At times, though, the difference becomes noticeable. Because of the approximate nature of the float and real data types, do not use these data types when exact numeric behavior is required, such as in financial applications, in operations involving rounding, or in equality checks. Instead, use the integer, decimal, money, or smallmoney data types. Avoid using float or real columns in WHERE clause search conditions, especially the = and <> operators. It is best to limit float and real columns to > or < comparisons.

The IEEE 754 specification provides four rounding modes: round to nearest, round up, round down, and round to zero. Microsoft SQL Server uses round up. All are accurate to the guaranteed precision but can result in slightly different floating-point values. Because the binary representation of a floating-point number may use one of many legal rounding schemes, it is impossible to reliably quantify a floating-point value.

0
добавлено
который теперь работает благодаря вашему ответу
добавлено автор vcRobe, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)