我是C#的新手,现在在数学方面有个问题。为什么我不能像这样仔细考虑或划分“简单”:
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);
编译器显示一个错误:
运算符“*”不能应用于“双”和“十进制”类型的操作数。
操作员也是如此..。
我怎样才能使我的代码工作?任何暗示都行。
发布于 2014-03-26 23:13:37
尝试下面的代码,您在"mFaktor“(应该是"mFactor”)附近有拼写错误
decimal mLon1 = 0;
decimal mLat1 = 0;
decimal mFactor = 111021;
decimal mRadius = 100;
decimal mLat = (decimal)12.123;
decimal mLon = 0;
mLon1 = mLon - mRadius / (decimal)Math.Abs(Math.Cos(((Math.PI / 180) * (double)mLat)) * (double)mFactor);
mLat1 = mLat - (mRadius / mFactor);
发布于 2014-03-26 23:48:55
C#是一种类型安全的语言,我所说的类型安全是指代码允许开发人员确定某个值或对象将是某种类型,这样他/她就可以以一种特定的方式使用它,而不必担心意外或未定义的行为。C#只隐式类型转换(如int到double )
更改代码,如下所示
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);
在这里,Convert.ToDouble(mLat)
将mLat
转换为double
,因为C#不允许将decimal
隐式转换为double
,我为什么要这样做?Math.Cos
显然只接受double
,Math.Abs
的情况也是如此
另一个解决方法是,您可以将每个声明的变量转换为double
,并在之间减少显式类型转换的痛苦。
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);
请参阅下面提到的引用,以及您希望在当前的场景中使用的类型。
参考资料:MSDN
发布于 2014-03-26 23:15:24
对于这种用法,您不应该使用十进制类型。使用双重类型,一切都会好起来的。
在您的示例中,数学函数返回一个双精度浮点(64位)数字,而十进制类型是128位浮点非本地数据类型。
你不能直接乘以两个没有相同内存大小的数字。
https://stackoverflow.com/questions/22680600
复制相似问题