C# 小数乘法和小数除法

C# 小数乘法和小数除法,c#,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 =

我是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”类型的操作数

与运算符“/”相同

我怎样才能让我的代码工作?
谢谢您的提示。

尝试下面的代码,您在“mFaktor”附近有拼写错误,应该是“mFactor”


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

您不应该使用decimal类型。使用双字体,一切都会好的

在您的例子中,math函数返回一个双精度浮点(64位)数,decimal类型是128位浮点非本机数据类型


不能直接将内存大小不同的两个数字相乘

首先,您的代码甚至没有编译

如果要将
12.123
用作
decimal
,则需要使用
m
m
后缀。如果浮动类型不使用任何后缀,C会认为它是一个
double

如果希望将数字实数文字视为十进制,请使用 后缀m或m。如果没有后缀m,数字将被视为双精度数字 并生成一个编译器错误

在浮点类型(
float
double
)和
decimal
类型之间

由于字段表示
double
,因此您的
Math.PI/180
将是
double
。因为
mLat
decimal
(你说这是一个拼写错误),所以你试图得到
double*decimal
,很明显,你得到了这些错误。您也尝试使用
/
运算符执行相同的操作

来自C#规范

来自C#Spec

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

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);
请参阅下面提到的参考资料,以及您在当前面临的场景中希望使用的类型


参考资料:

您不是在
decimal mLat=12.123行中也遇到编译错误吗?我相信你需要像这样给它加后缀:
decimal mLat=12.123M
将它分解为几个小步骤,以确定哪个部分抛出了错误。如果不查找,您可能需要一些类型转换。十进制是用于财务和货币计算的,这些变量可能应该是双精度的。对不起,拼写错误仅出现在我手工键入的samlpe中。您使用双精度十进制转换的解决方案有效。谢谢!好的,我现在明白转换的问题了。但是我的主要变量应该仍然是
decimal
s,因为在这种情况下,我使用的是数据库中的地理点。我读过一些关于基于10进制表示的行为问题的帖子()。在我的案例中应该使用哪种类型?我的计算精度不需要超过10米。。。
float operator /(float x, float y);
double operator /(double x, double y);
decimal operator /(decimal x, decimal y);
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);
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);