C# c十进制属性非预期截断
我最近将一个属性从double改为decimal,并发现了一个奇怪的效果。 属性返回的所有数字都被截断 这是代码的一部分: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); } } 如果我在代码
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); }