I´m new to C# and have now a Problem with mathematical stuff. Why can´t I mulitplicate or divide "simple" like this:
decimal mLon1 = 0;
decimal mLat1 = 0;
decimal mFactor = 111021;
decimal mRadius = 100;
decimal mLat = 12.123;
mLon1 = mLon - mRadius / Math.Abs(Math.Cos(((Math.PI / 180) * mLat)) * mFaktor);
mLat1 = mLat - (mRadius / mFaktor);
Compiler Shows an error:
The Operator '*' can not be applied to operands of type 'double' and 'decimal'.
Same with Operator '/' ...
How can I get my code workin? Thx for any hint.
C# is a type-safe language, what i meant by type safe is that the code allows the developer to be certain that a value or object will be of a certain type so that he/she can use it in a specific way without fear of unexpected or undefined behavior. C# only some implicit conversion of types like int to double
Change your code as shown below
decimal mLon1 = 0M;
decimal mLat1 = 0M;
decimal mFactor = 111021M;//mFactor is never used
decimal mRadius = 100M;
decimal mLat = 12.123M;
mLon1 = mLon - mRadius / Math.Abs(Convert.ToDecimal(Math.Cos((Math.PI / 180) * Convert.ToDouble(mLat))) * mFaktor);//mFaktor and mLon is not defined
mLat1 = mLat - (mRadius / mFaktor);
Here Convert.ToDouble(mLat) converts mLat to double since C# doesn't allow implicit conversion of decimal to double, why am I doing this? Well Math.Cos apparently accepts only double, so is the case of Math.Abs
Another workaround is that you could convert every declared variables as double and reduce the pain of explicit type conversions in between
double mLon1 = 0D;
double mLat1 = 0D;
double mFactor = 111021D;//mFactor is never used
double mRadius = 100D;
double mLat = 12.123D;
mLon1 = mLon - mRadius / Math.Abs(Math.Cos(((Math.PI / 180D) * mLat)) * mFaktor);//mFaktor and mLon is not defined
mLat1 = mLat - (mRadius / mFaktor);
Please see the below mentioned reference and what type is that you want to use in the present scenario that you are facing.

Reference: MSDN
First of all, your code doesn't even compile.
If you want to use 12.123 as a decimal, you need to use m or M suffix. If you don't use any suffix with your floating type, C# thinks it is a double.
From decimal (C# Reference)
If you want a numeric real literal to be treated as decimal, use the suffix m or M. Without the suffix m, the number is treated as a double and generates a compiler error.
And there are no implicit conversions between floating-point types (float and double) and the decimal type.
Since Math.PI field represents double, your Math.PI / 180 will be double. Since mLat is decimal (you said it is a spelling mistake) you try to get double * decimal which is clearly you get these error. You try to same operation with / operator also.
From C# Spec $7.7.1 Multiplication operator
float operator *(float x, float y);
double operator *(double x, double y);
decimal operator *(decimal x, decimal y);
And from C# Spec $7.7.2 Division operator
float operator /(float x, float y);
double operator /(double x, double y);
decimal operator /(decimal x, decimal y);
As you can see from these documentations, there is no defined double * decimal or double / decimal operations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With