乘法和小数除法

时间:2014-03-27 07:10:32

标签: c#

我是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);

编译器显示错误:

  

运算符'*'不能应用于'double'和'decimal'类型的操作数。

与运营商'/'...

相同

如何让我的代码工作? 任何提示都是如此。

5 个答案:

答案 0 :(得分:4)

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显然只接受doubleMath.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);

请参阅下面提到的参考资料以及您要在当前情景中使用的类型。

Floating point reference

参考:MSDN

答案 1 :(得分:2)

您不应该使用十进制类型来实现此用途。使用双重类型,一切都会好的。

在您的情况下,数学函数返回双精度浮点(64位)数,十进制类型是128位浮点非本机数据类型。

您无法直接将两个不具有相同内存大小的数字相乘。

答案 2 :(得分:1)

首先,您的代码甚至无法编译。

如果您想将12.123用作decimal,则需要使用mM后缀。如果您不使用浮动类型的任何后缀,C#认为它是double

来自decimal (C# Reference)

  

如果要将数字实数文字视为十进制,请使用   后缀m或M.如果没有后缀m,则将数字视为double   并生成编译器错误。

浮点类型floatdouble)与decimal类型之间的there are no implicit conversions

由于Math.PI字段代表double,您的Math.PI / 180将为double。由于mLatdecimal(您说这是拼写错误),您尝试获取double * decimal,显然您会收到这些错误。您也尝试与/运算符进行相同的操作。

来自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);

来自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);

从这些文档中可以看出,没有定义double * decimaldouble / decimal个操作。

答案 3 :(得分:0)

尝试下面的代码,你在“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);

答案 4 :(得分:0)

您还可以使用double类型的变量,而不是decimal