2015-04-19 2 views
3

С SQL Server 2008R2 я получаю разницу знака при округлении «того же» числа, что и десятичное или плавающее.Избавление от отрицательного нулевого значения для float

Пример кода, показывающий разницу:

DECLARE @f float = -0.00001; 
    DECLARE @d decimal = -0.00001; 
    PRINT CONVERT(varchar,ROUND(@f, 4)) --- outputs -0 
    PRINT CONVERT(varchar,ROUND(@d, 4)) --- outputs 0 

Мне нужно округлить значение с плавающей точкой в ​​0, не -0.

Я думаю, что это сводится к спецификации IEEE 754, которая определяет два нулевого представления (положительные и отрицательные), тогда как десятичные числа имеют только один ноль. Я думаю, что оператор равенства по поплавкам справляется с этим, но мне приходится сравнивать две строки с плавающей точкой AS для соображений совместимости.

Есть функция/опция, чтобы избавиться от отрицательных нулей (по крайней мере, при преобразовании в строку)?

+2

Уродливые, но эффективное решение будет следующим образом: 'ПРЕОБРАЗОВАНИЯ (VARCHAR, случай, когда ROUND (@f, 4) = -0 ТОГДА 0 ИНАЧЕ ROUND (@f, 4) КОНЕЦ)' ' –

+0

ПЕЧАТЬ abs (CONVERT (varchar, ROUND (@f, 4))) ' –

+0

@RahulTripathi - Это также преобразует' -4' в '+ 4' –

ответ

-1

@Pascal Попробуйте ввести код .. Дайте мне знать, если это вам помогло.

DECLARE @f float = -0.00001; 
    DECLARE @d decimal = -0.00001; 
    PRINT abs(ROUND(@f, 4)) --- outputs 0 
    PRINT abs(ROUND(@f, 4)) --- outputs 0 
+0

Этот код будет выводить то же значение для -4.0 и 4.0. Я хочу избавиться только от отрицательного нуля. – Pascal

2

Добавление значения 0.0 в значение устраняет проблему. Спасибо tmyblebu за ответ.

 PRINT CONVERT(varchar,ROUND(@f + 0.0, 4)) 
Смежные вопросы