public static decimal Truncate(decimal d, byte decimals)
decimal r = Math.Round(d, decimals);
return r - new decimal(1, 0, 0, false, decimals);
return r + new decimal(1, 0, 0, false, decimals);
public static decimal Truncate2(decimal d, int decimals)
decimal step = (decimal)Math.Pow(10, decimals);
decimal tmp = Math.Truncate(step * d);
public static void Assert(decimal expected, decimal value, byte precission)
var actual = Truncate(value, precission);
var actual2 = Truncate2(value, precission);
Console.WriteLine(String.Format("M1: {0}\t{1}\t{2}\t{3}", value, precission, actual, expected));
Console.WriteLine(String.Format("M2: {0}\t{1}\t{2}\t{3}", value, precission, actual2, expected));
public static void Main()
Assert(-1.12m, -1.129m, 2);
Assert(-1.12m, -1.120m ,2);
Assert(-1.12m, -1.125m ,2);
Assert(-1.12m, -1.1255m,2);
Assert(-1.12m, -1.1254m,2);
Assert(-0.1m, -0.14m ,1);
Assert(-0.1m, -0.15m ,1);
Assert(-0.1m, -0.16m ,1);
Assert(-0.1m, -0.19m ,1);
Assert(-0.1m, -0.199m ,1);
Assert(-0.1m, -0.101m ,1);