C# 除以0.9 c始终返回0

C# 除以0.9 c始终返回0,c#,math,C#,Math,我试着做一个简单的数学图片,我计算出一个值是否在两个值之间,如果是的话,它应该做一个简单的除法。但是,有时值除以类似于0.9、0.6等,并且总是返回0 在这个例子中 int m_LocationSqrMtr = 4339; float m_DefaultPricing = Convert.ToSingle(DefaultPricing); float m_manDays; if (m_LocationCosts > 450 && m_LocationCosts <

我试着做一个简单的数学图片,我计算出一个值是否在两个值之间,如果是的话,它应该做一个简单的除法。但是,有时值除以类似于0.9、0.6等,并且总是返回0

在这个例子中

int m_LocationSqrMtr = 4339;
float m_DefaultPricing = Convert.ToSingle(DefaultPricing);
float m_manDays;

if (m_LocationCosts > 450 && m_LocationCosts < 700)
{
    m_DefaultPricing = 700 / m_LocationSqrMtr;    
}

我猜m_LocationSqrMtr的类型是int,在这种情况下,表达式为:

700 / m_LocationSqrMtr
。。。将使用整数算术计算,并将结果转换为浮点。我怀疑你想要:

if (m_LocationCosts > 450 && m_LocationCosts < 700)
{
    m_DefaultPricing = 700f / m_LocationSqrMtr;    
}
文本上的f后缀表示它是浮点文本,因此首先m_LocationSqrMtr将被提升为浮点,然后使用浮点运算执行除法

但是,如果这是表示货币值,你应该考虑使用十进制而不是浮点——然后可能将数值舍入到2个小数点。如果所有的货币算术都是十进制的,那么就不太可能出现意外的结果……

如果m_LocationSqrMtr的类型是int,如32位整数,那么表达式

700 / m_LocationSqrMtr
是一个整数除以另一个整数,其类型为integer。只有在生成该整数后,才会将结果分配给浮点m_DefaultPricing,因此基本上您的代码相当于:

int temp = 700 / m_LocationSqrMtr;  
m_DefaultPricing = (float) temp;
如果要强制进行浮点运算,则至少需要一个操作数是浮点数。有很多方法可以做到这一点:

m_DefaultPricing = 700.0 / m_LocationSqrMtr; //explicit decimal point

m_DefaultPricing = 700f / m_LocationSqrMtr; //explicit float specification

m_DefaultPricing = (float)700 / m_LocationSqrMtr;  //casting one operand
m_DefaultPricing = 700f / (float)m_LocationSqrMtr; //into a float
你有:

int m_LocationSqrMtr = 4339;
[...]
m_DefaultPricing = 700 / m_LocationSqrMtr;    
也就是700/4339,它是整数/整数,其结果是整数

我知道你期望的答案是0.16132


但从整数的角度来看,这个值是零。

在更概念化的层面上,已经有很多很好的实用答案:

在C语言中,如果运算符的两边都是整数,则结果也是整数,任何十进制数字都会被截断。一般来说,对于数学来说,该语言将生成与输入类型相同的结果,并且具有最精确的类型。存储结果的变量类型不会对结果产生影响,只会影响输入的类型

通过强制一个输入为十进制或浮点,您也可以强制输出为十进制或浮点。实际上,您可以通过将其中一个输入变量声明为十进制或浮点来实现这一点,具体取决于您使用的变量,在您的情况下,您可以更改m_LocationSqrMtr的类型,或者如果您有一个常量输入,您可以强制它为十进制/浮点/双精度,如下所示:

var a = 10f // float
var b = 10d // double
var c = 10m // decimal
var d = 10.0 // double I believe

什么是m_LocationSqrMtr?整数除法在小数点后截断。m是什么类型的_LocationSqrMtr@SLaks大概大于700,事实上是4339,他没有除以0.9@阿贝伦基,那是只僵尸小猫。嗨,谢谢你。我已经将m_DefaultPricing设置为十进制,但是它仍然返回0。当它是一个浮点数的时候,f确实用了大量的小数。但你说的是对的。我如何让它与十进制一起工作?@TomBeech:用m后缀代替f。