LINQ to SQL Math.Round问题

时间:2009-09-04 20:16:16

标签: c# linq linq-to-sql math rounding

我遇到了一个问题,我写了一个问题,由于某种原因,我用来存储小数值的变量返回小数点后的6个值(它们大多数为0)。

我尝试过以下(以及使用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成员是Decimal类型)。请参阅下面的答案。

3 个答案:

答案 0 :(得分:2)

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

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

显示2位小数。

十进制类型在内部使用整数和小数比例因子。它的缩放因子产生尾随0.如果从缩放因子为2的小数类型开始,即使它们为0,您将得到小数点后的2位数。

添加和减去小数将产生一个小数,其缩放因子是所涉及的小数的最大值。因此,使用相同的结果十进制从另一个中减去一个比例因子为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。

答案 1 :(得分:2)

System.Decimal按设计保留尾随零。换句话说,1m1.00m是两个不同的decimal s(尽管它们将相等),并且可以被解释为四舍五入到不同的小数位数 - 例如Math.Round(1.001m)1mMath.Round(1.001m, 2)1.00m。算术运算符对它们的处理方式不同 - +-将生成一个与操作数相同的位置的结果,其中包含大部分(因此1.50m + 0.5m == 1.10m)和{{1 }和*将拥有其操作数的位数总和(所以/)。

答案 2 :(得分:0)

我使用与之前相同的参数使用Decimal.Round()。 :)

看起来这个问题在某种程度上与Pavel的说法有关,其中Decimal类型的行为有所不同,看起来Math.Round并不像人们期望的那样对它们起作用......

感谢您的所有输入。