2009-09-04 135 views
2

我遇到了一个问题,我写了一个查询,因为某些原因,我用来存储十进制值的变量返回小数点后的6个值(它们大部分0)。LINQ to SQL Math.Round问题

我试过以下(和使用Math.Round的不同组合),没有运气。

Sales = 
      (from invhed in INVHEAD 
      ... // Joins here 
      orderby cust.State ascending 
      select new Sale 
      { 
       InvoiceLine = inv.InvoiceLine, 
       InvoiceNum = inv.InvoiceNum, 
       ... 
       NetPrice = Math.Round((inv.ExtPrice - inv.Discount) * (Decimal) (qsales.RepSplit/100.0), 2, MidpointRounding.ToEven), 
      }).ToList<Sale>(); 

的NetPrice构件具有类似值300.000000,5000.500000,3245.250000等

任何线索?我似乎无法在网上找到有关此问题的任何信息。

编辑:

Decimal.Round的伎俩(我忘了提及的是,NetPrice成员是一个小数型)。请参阅下面的答案。

回答

0

我得到它使用Decimal.Round()与以前相同的参数工作。 :)

看起来这个问题是有点在帕维尔说什么,在小数类型的行为有所不同,看起来Math.Round并不像他们所期望的那样工作......

感谢您的所有输入。

2

尾随零可以出现在小数类型的.ToString的输出中。您需要使用正确的格式字符串指定要显示的小数点后的位数。例如: -

var s = dec.ToString("#.00"); 

显示2位小数。

内部十进制类型使用整数和十进制缩放因子。它的缩放因子引起尾随0.如果以比例因子为2的小数类型开始,即使它们为0,小数点后面也会有2位数字。

添加和减去小数点将产生一个小数,其中的小数位数是所涉及的小数的最大值。因此,从另一个小数点减去小数点后第一位的换算系数为2,结果小数也相同。

小数点的乘除法将生成一个小数点,该小数点的换算系数为两个小数运算数的缩放因子。乘以2分的结果的比例因子小数在拥有4

比例因子试试这个新的小数: -

var x = new decimal(1.01) - (decimal)0.01; 
var y = new decimal(2.02) - (decimal)0.02; 
Console.WriteLine(x * y * x * x); 

你得到2.00000000。

+0

奇怪的是,这是划分操作,搞乱了事情。如果我只是这样做:inv.ExtPrice - inv.Discount,我得到一个十进制值,在我的XML输出中只有2个小数位。 – Overhed 2009-09-04 20:29:12

2

System.Decimal通过设计保留尾随零。换句话说,1m1.00m是两个不同的decimals(尽管它们将相等比较),并且可以被解释为四舍五入到不同的小数位数 - 例如, Math.Round(1.001m)会给1m,而Math.Round(1.001m, 2)会给1.00m。算术运算符以不同的方式处理它们 - +-将产生与具有大多数(所以1.50m + 0.5m == 1.10m)和*/的操作数具有相同数量的位置的结果将具有它们的操作数的位置数的总和(所以1.00m * 1.000m == 1.00000m)。