Приведите денежный тип SQL к десятичному типу CLR.Десятичное число - это числовой тип с плавающей запятой, который использует внутреннее представление base-10 и поэтому может представлять любое десятичное число в диапазоне без аппроксимации.
Это медленнее, чем число с плавающей запятой, и вы торгуете диапазон для точности, но длячто-либо, связанное с деньгами, используйте десятичное число, чтобы избежать ошибок аппроксимации.
РЕДАКТИРОВАТЬ: Что касается "почему это происходит" - две причины.Во-первых, числа с плавающей точкой используют внутреннее представление base-2, в котором невозможно точно представить некоторые десятичные дроби.Во-вторых, причина того, что числа с плавающей точкой называются числами с плавающей точкой, состоит в том, что вместо использования фиксированной точности для целочисленной части и фиксированной точности для дробной части, они обеспечивают непрерывный компромисс между величиной и точностью.Числа, в которых неотъемлемая часть относительно мала - например, 1,5 - позволяют большей части внутреннего представления быть назначенной дробной части, и, таким образом, обеспечивают гораздо большую точность.Поскольку величина интегральной части увеличивается, биты, которые ранее использовались для точности, теперь необходимы для хранения большего целочисленного значения, и поэтому точность дробной части снижается.
Очень, очень грубо, это похоже наимея десять цифр, и вы можете поместить десятичную точку где угодно, поэтому для небольших значений вы можете представлять очень точные дроби:
1.0000000123
, но для больших значений у вас не так много дробной точностидоступно:
1234567890.2
Для получения подробной информации о том, как на самом деле работает , ознакомьтесь со стандартом IEEE 754 .