2

我在写的查询中遇到问题,由于某种原因,我用来存储十进制值的变量在小数点后返回 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 类型)。请看下面我的回答。

4

3 回答 3

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。

于 2009-09-04T20:25:32.313 回答
2

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

于 2009-09-04T20:36:33.303 回答
0

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

看起来这个问题有点像 Pavel 所说的那样,其中 Decimal 类型的行为不同,而且看起来 Math.Round 并不能像人们期望的那样与它们一起工作......

感谢所有的投入。

于 2009-09-04T20:47:32.113 回答