【问题标题】:c# decimal property unintended truncationc#小数属性意外截断
【发布时间】:2014-09-24 07:53:48
【问题描述】:

我最近将一个属性从 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

【问题讨论】:

  • int a = 5980/1000 = 5
  • 十进制 a = 5980/1000 = 5
  • return (decimal)_SalesPrice / 1000;
  • Using double instead of decimal works just fine. - 很确定它没有。 WTF 还对所有答案投了反对票?

标签: c# decimal truncation


【解决方案1】:

你正在做整数除法,而不是小数:

return _SalesPrice / 1000M;

【讨论】:

    【解决方案2】:
    return Convert.ToDecimal(_SalesPrice / 1000);
    

    您将在除法之后转换为十进制,这将在整数上执行,即被截断。除法前转换。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • @Downvoter 至少愿意发表评论,这样我就可以知道我可能错在哪里?
      【解决方案4】:

      您的值被截断,因为您将一个 int 与一个 int 分开。将1000 更改为1000.0。将其除以 double 会在除法之前对其进行转换。

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

      【讨论】:

        猜你喜欢
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        相关资源
        最近更新 更多