我遇到了一个问题,我写了一个问题,由于某种原因,我用来存储小数值的变量返回小数点后的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类型)。请参阅下面的答案。
答案 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
按设计保留尾随零。换句话说,1m
和1.00m
是两个不同的decimal
s(尽管它们将相等),并且可以被解释为四舍五入到不同的小数位数 - 例如Math.Round(1.001m)
会1m
,Math.Round(1.001m, 2)
会1.00m
。算术运算符对它们的处理方式不同 - +
和-
将生成一个与操作数相同的位置的结果,其中包含大部分(因此1.50m + 0.5m == 1.10m
)和{{1 }和*
将拥有其操作数的位数总和(所以/
)。
答案 2 :(得分:0)
我使用与之前相同的参数使用Decimal.Round()。 :)
看起来这个问题在某种程度上与Pavel的说法有关,其中Decimal类型的行为有所不同,看起来Math.Round并不像人们期望的那样对它们起作用......
感谢您的所有输入。