c#decimal属性意外截断

时间:2014-09-24 07:53:48

标签: c# decimal truncation

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

这是代码的一部分:

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 代替十进制可以正常工作。

我正在使用VS2010

4 个答案:

答案 0 :(得分:2)

你正在进行整数除法,而不是十进制:

return _SalesPrice / 1000M;

答案 1 :(得分:0)

return Convert.ToDecimal(_SalesPrice / 1000);

您在分割后转换为十进制,这将在整数上执行,即截断。分裂前转换。

此外,此处不需要使用Convert,只需使用普通模型。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我强烈怀疑,因为你在吸气器中正在做integer division。它总是丢弃小数部分。

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

一个选项可以将整数除法更改为浮点除法;

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