我正在尝试做一个简单的数学picee,如果值在两个值之间,我会计算出来,如果是,它确实如此,它应该做一个简单的除法。但是有时候除以的值就像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;
}
答案 0 :(得分:9)
我的猜测是m_LocationSqrMtr
的类型是int
,在这种情况下这个表达式:
700 / m_LocationSqrMtr
...将使用整数算法计算,结果转换为float
。我怀疑你想要:
if (m_LocationCosts > 450 && m_LocationCosts < 700)
{
m_DefaultPricing = 700f / m_LocationSqrMtr;
}
字面上的f
后缀表示它是float
字面值,因此首先将m_LocationSqrMtr
提升为float
,然后使用{{1}执行除法算术。
但是,如果这意味着代表货币值,则应考虑使用float
而不是decimal
- 然后可能将值舍入为2位小数。如果您在float
中执行所有货币算术运算,则不太可能遇到意外结果......
答案 1 :(得分:3)
你有:
int m_LocationSqrMtr = 4339;
[...]
m_DefaultPricing = 700 / m_LocationSqrMtr;
即700 / 4339
,即(integer) / (integer)
,其结果为整数。
我知道你期待得到0.16132...
的答案。
但就整数而言,该值为 ZERO 。
答案 2 :(得分:0)
如果m_LocationSqrMtr
的类型为int
,如32位整数,那么表达式
700 / m_LocationSqrMtr
是一个整数除以另一个整数,它的类型是整数。只有在生成此整数后才会将结果分配给float 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
答案 3 :(得分:0)
在概念层面上已经有很多很好的实际答案:
在C#中,如果运算符的两边都是整数,则结果也是整数,并且任何十进制数字都会被截断。通常,对于数学,语言将生成与具有最精确类型的输入相同类型的结果。存储结果的变量类型不会仅对输入的类型产生影响。
通过强制一个输入为十进制或浮点数,您也可以强制输出。在实践中,您可以通过将您的输入变量之一声明为十进制或浮点数(取决于您使用哪个,在您的情况下您将更改m_LocationSqrMtr的类型)或者如果您有一个常量输入(就像您这样做)你可以将它强制为十进制/浮点数/双精度,如下所示:
var a = 10f // float
var b = 10d // double
var c = 10m // decimal
var d = 10.0 // double I believe