Decimal Entity Framework rounding inconsistent in projection

EF6 seems inconsistent in the way it handles rounding when multiplying and adding integer columns with decimal values.

// CREATE TABLE MyTable (MyIntValue INT NOT NULL) // INSERT INTO MyTable (MyIntValue) VALUES (10) const int IntScale = 5; const decimal DecimalScale = 5; const decimal DecimalScale2 = 5.0m; context.Set<MyTable>() .Select(row => new { WithFloats = 0.5f + (row.MyIntValue * 5.0f), // 50.5 WithDecimals = 0.5m + (row.MyIntValue * 5.0m), // 51 WithDecimals2 = 0.5m + ((decimal)row.MyIntValue * 5.0m), // 50.5 WithDecimals3 = 0.5m + ((decimal)row.MyIntValue * IntScale), // 51 WithDecimals4 = 0.5m + ((decimal)row.MyIntValue * (decimal)IntScale) // 51 WithDecimals5 = 0.5m + ((decimal)row.MyIntValue * DecimalScale) // 51 WithDecimals6 = 0.5m + ((decimal)row.MyIntValue * DecimalScale2) // 50.5 }) .Single(); 

Is this not the expected / correct behavior? I expect WithDecimals to be 50.5 (not 51). Can I skip something simple? How can I guarantee that WithoutDecimals is not rounded without changing the type of other constants?

Generated SQL for WithFloats and WithDecimals (respectively):

 ,CAST(0.5 AS REAL) + (CAST(MyIntValue AS REAL) * CAST(5 AS REAL)) AS WithFloats ,0.5 + (CAST(MyIntValue AS DECIMAL(19,0)) * CAST(5 AS DECIMAL(18))) AS WithDecimals 
+7
decimal c # rounding entity-framework
source share
1 answer

Explicitly determine the type of column as well as the precision and scale of the decimal field using data annotation

 [Column(TypeName = "decimal(5,2)")] public decimal MyDecimal { get; set; } 

You can find the default LINQ to SQL CLR type mappings that apply when using EF here .

Read the T-SQL numeric and decimal data types here .

0
source share

All Articles