Я понимаю, что decimal
- это формат чисел, подходящий для финансов и денег в целом, поскольку он имеет фиксированную точность.Поскольку операция «десятичная» * «десятичная» приводит к потере точности, но разрешена, почему операция «десятичная» * «двойная» запрещена?
Таким образом, при добавлении или вычитании двух decimals
, никогда не может быть потери точности.
Учитывая это, я могу понять, что операция 'decimal
' + 'double
' должна быть запрещена компилятором, так как может быть потеря точности.
Но что происходит, когда вы умножаете (или разделяете) два decimals
?
Давайте рассмотрим простой десятичный тип, всего 4 цифры и 2 цифры точности после десятичной точки (с 00.00 до 99.99).
Вы можете определить a = 0.01
Тогда m = a * a = 0.0001
, усеченный до 0.00
так происходит потеря точности.
Несмотря на потерю точности, эта операция считается законной компилятором.
Итак, мы имеем следующие случаи в C#:
decimal/int
: правовые, несмотря на потерю точностиdecimal/decimal
: правовые, несмотря на потерю точностиdecimal * decimal
: правовые, несмотря на потери точностиdecimal * double
: незаконный
(Of co urse, вы всегда можете переопределить литой, но это решение не удовлетворяет меня.)
Есть ли другая причина, по которой я не знаю, чтобы объяснить это?
Если вы имеете дело с процентной ставкой или ставкой НДС или ставками в целом, мне будет более логично использовать двойной для хранения этих значений, а затем иметь возможность использовать их с десятичной точкой. Но я должен выбирать между:
- хранения скорости с
decimal
(излишним). - хранение ставки с помощью
double
, затем литье (уродливое).
Со всем, что в виду, мой вопрос:
Есть ли причина, почему «decimal
» * «double
» запрещен C# компилятор?
Hm, на самом деле это 'var s = (double) (12.4m * 23.3d);' также запрещено, хотя и дается результат. Я думаю, что речь идет о том, чтобы компилятор просто __how__ выполнял вычисления. – TaW
@TaW, что более вероятно из-за подвыражения '(12.4m * 23.3d)' неспособности по причине, приведенной в этом ответе – AlexFoxGill
Спасибо за подробный ответ. Что касается ставок, которые я хотел бы хранить, это могут быть такие вещи, как «1/3 = 0,3333 ...», которые могут храниться точно с десятичной или двойной. – Fumidu