C# c十进制属性非预期截断

C# c十进制属性非预期截断,c#,decimal,truncation,C#,Decimal,Truncation,我最近将一个属性从double改为decimal,并发现了一个奇怪的效果。 属性返回的所有数字都被截断 这是代码的一部分: private int _SalesPrice; // [ ... ] public decimal SalesPrice { get { return Convert.ToDecimal(_SalesPrice / 1000); } set { _SalesPrice = Convert.ToInt32(value * 1000); } } 如果我在代码

我最近将一个属性从double改为decimal,并发现了一个奇怪的效果。 属性返回的所有数字都被截断

这是代码的一部分:

private int _SalesPrice;

// [ ... ]

public decimal SalesPrice
{
   get { return Convert.ToDecimal(_SalesPrice / 1000); }
   set { _SalesPrice = Convert.ToInt32(value * 1000); }
}
如果我在代码中有如下内容:

SalesPrice = 5.98
_SalesPrice将为5980,但SalesPrice返回5,不带小数

这背后的原因是什么? 用double代替decimal很好


我使用的是VS2010,您使用的是整数除法,而不是十进制:

return _SalesPrice / 1000M;
您将在除法后转换为十进制,除法将对整数执行,即截断。在除法之前先转换


此外,这里不需要使用Convert,只需使用普通类型转换。

您的值被截断,因为您将int除以int。将1000更改为1000.0。除以一个双精度将在除以之前转换它

public decimal SalesPrice
{
   get { return Convert.ToDecimal(_SalesPrice / 1000.0); }
   set { _SalesPrice = Convert.ToInt32(value * 1000.0); }
}

我强烈怀疑,因为你正在做你的getter。它总是丢弃小数部分

这就是为什么你的5980/1000总是返回5

一个选项是将整数除法改为浮点除法,如:

get { return Convert.ToDecimal(_SalesPrice / 1000.0); }

int a=5980/1000=5十进制a=5980/1000=5返回十进制\销售价格/1000;用double代替decimal很好很肯定不会。此外,WTF对所有答案都投了否决票?@Downvoter是否愿意发表评论,至少这样我可以看出我可能错在哪里?
get { return Convert.ToDecimal(_SalesPrice / 1000.0); }