Modulo ( % ) работает с десятичным типом данных, но не с float или real. Почему?
почему модуль работает нормально с десятичной, но не с float / real MSDN заявляет об этом"должно быть допустимым выражением любого из типов данных в категориях целочисленных и денежных типов данных или числового типа данных."почему не плавающие значения, потому что это приблизительное значение ??
--Runs fine
declare @pri decimal
set @pri = 3.25
select @pri%2
результат 1
--Gives an error 402
declare @pri float
set @pri = 3.25
select @pri%2
Msg 402, Уровень 16, Состояние 1, Строка 3 Типы данных float и numeric несовместимы по модулю оператор.
4 ответов
Если ваш вопрос о документации?
dividend должно быть допустимым выражением любого из типов данных в целочисленные и денежные категории типов данных, или цифровой сведения тип.
Он говорит целое, денежное (деньги, smallmoney) и числовое
таким образом, decimal не поддерживается. В документации говорится ,что "числовой функционально такой же, как десятичный", но может быть может, это имеет другое значение в каком-то контексте, как этот.
Я думаю, float рассматривается как числовой тип данных, где как decimal не
читать типы данных. Он имеет информацию о типах денежных данных. (деньги, smallmoney)
обновление:
здесь список типов данных catagory wise. Вы можете следовать ссылкам на numeric и money, чтобы найти, какие типы данных попадают в него
возможно, ограничение предназначено для защиты от неожиданных результатов. Операции по модулю, как правило, дают дико неожиданные результаты при использовании с неточной арифметикой.
целочисленные и денежные числовые типы подходят для точной арифметики, в то время как двоичная плавающая точка не подходит. Например, вы ожидаете, что 0.3 % 0.01 даст вам ровно ноль, число, близкое к нулю, или число, близкое к 0.01? Денежные типы могут сделать это точно. Результаты с помощью бинарных плавающая точка более удивительна.
, потому что float
и real
представляют собой вещественные числа, которые всегда можно разделить без остатка. Определение по модулю:
a mod n = r
, Если a = n*q + r
, где a
,n
,q
и r
are чисел, для наименьшего возможного абсолютного значения r
.
посмотреть http://en.wikipedia.org/wiki/Modulo_operation
для других, нецелочисленных, но фиксированных точечных переменных определение по модулю может найти, потому что два значения с фиксированной точкой не всегда можно разделить без остатка. Однако обычно вы хотите использовать только по модулю для целочисленной арифметики, иначе вы получите результаты, отличные от ожидаемых.
что вы пытаетесь достичь здесь? Modulo-это целочисленный оператор, он вычисляет остаток целочисленного деления.
Если вы ожидаете 1.25 в результате преобразования pri
к целому числу, деление (это даст вам 1) умножить на 2 и вычесть результат из pri
(3.25 - ((3/2) *2).