2009-09-04 9 views
2

何らかの理由で小数点以下の値を小数点以下の値に格納するために使用している変数がどこに書かれているかという問合せに問題があります。 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>(); 

ネットプライス部材等300.000000、5000.500000、3245.250000、

任意の手がかりのような値を持って?私はオンラインでこの問題について何かを見つけることができない。

EDIT:

Decimal.Roundは(私はネットプライスのメンバーは、decimal型であったことを言及するのを忘れてしまった)トリックを行いました。下の私の答えを見てください。

答えて

0

以前と同じ引数でDecimal.Round()を使用して動作させました。 :)

パヴェルが言っていた、Decimalの種類が異なっていて、それがMath.Roundと思われるように見えるのは、ある人が期待しているように、

すべての入力をありがとう。

2

末尾のゼロは、十進数型の.ToStringの出力に現れることがあります。正しい書式文字列を使用して表示する小数点以下の桁数を指定する必要があります。たとえば、 -

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

小数点以下2桁を表示します。

内部的には、小数点タイプは整数と小数点の倍率を使用します。その後ろに0を発生させる倍率です。倍率2の10進数型で始めると、0であっても小数点以下2桁が得られます。

小数点の加算と減算は、小数点以下の桁数になります。これは、小数点以下の桁数の最大値です。したがって、2のスケーリング係数を持つ1つの小数点を、結果の小数点を同じにして他のものから減算すると、2の因数も得られます。

小数点を掛けて除算すると、 2つの10進数のオペランドの倍率。あなたが2.00000000を得る

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

- :4.

の倍率を持つ新しい小数で2つの結果のスケーリング係数との乗算小数はこれを試してみてください。

+0

奇妙なことは、物事を乱す分裂操作だということです。私がちょうどした場合:inv.ExtPrice - inv.Discount、XML出力に小数点以下2桁の小数点を返します。 – Overhed

2

System.Decimalは、デザインによって末尾のゼロを保持します。つまり、1m1.00mは2つの異なる値です(ただし、等しいと比較します)。小数点以下の桁数を四捨五入していると解釈することができます。 Math.Round(1.001m)1mMath.Round(1.001m, 2)1.00mとなる。算術演算子はそれらを異なる方法で扱います。+-は、ほとんどのオペランド(つまり1.50m + 0.5m == 1.10m)と同じ個数の結果を生成し、*/は、そのオペランドの個数の合計を持ちますso 1.00m * 1.000m == 1.00000m)。