Ну, краткий ответ таков: 1999,9999
округленное до 2 десятичных знаков на самом деле 2000,00
.
Существует несколько различных стратегий округления & mdash; http://en.wikipedia.org/wiki/Rounding & mdash; Вы можете прочитать о них.
Но если вы не хотите округлять значение и вместо этого урезать его, то это должно сработать. scale
- это степень 10, указывающая положение, в котором должно произойти усечение. Если scale
является отрицательной степенью 10 (например, 10 -2 ), то будет происходить усечение на столько цифр справа от десятичной запятой. Если scale
неотрицательно, то усечение происходит слева от десятичной точки (например, шкала 1
aka 10 0 будет усекать дробь, и scale
из 100 (или 10 2 ) обрежет все справа от места 100, преобразовав 1999.9999m
в 1900m
.
decimal TruncateToHundredthsPlace( decimal value )
{
const decimal scale = 0.01m ; // 10^-2
decimal result = value - ( value % 0.01m ) ;
return results ;
}
Кроме того, вы можете написать метод, подобный следующему коду. Это работает для любой шкалы: отрицательные значения для шкала усекают столько позиций справа от десятичной точки; ненулевые значения усекаются слева от десятичной точки.
public static decimal Truncate( decimal value , int scale )
{
Decimal factor = Power(10,scale) ;
decimal result = value - ( value % factor ) ;
return result ;
}
private static decimal Power( int m , int n )
{
if ( m < 1 ) throw new ArgumentOutOfRangeException("m") ;
Decimal @base = (decimal) m ;
Decimal factor = 1m ; // m^0 = 1
while ( n > 0 )
{
factor *= @base ;
--n ;
}
while ( n < 0 )
{
factor /= @base ;
++n ;
}
return factor ;
}
Вычисление степени десятичной дроби стоит дорого. Однако две простые оптимизации ускорили бы его:
Во-первых, предварительно вычислите некоторое разумное количество степеней 10 в статической справочной таблице, скажем, 10 -10 - 10 + 10 включительно. Я бы создал decimal[]
с отрицательной нижней границей: тогда проверка того, находится ли указанный масштаб в справочной таблице, состоит только из проверки, является ли значение масштаба допустимым индексом в массиве. Если это так, вытащите коэффициент, используя значение шкалы в качестве индекса.
Вторая оптимизация будет заключаться в кэшировании мощности 10 значений при их вычислении. Если вы уже вычислили значение, вам не нужно его пересчитывать, просто извлеките его из кэша, используя шкалу в качестве ключа.