Menurut dokumentasi, decimal.Round
metode ini menggunakan algoritma round-to-even yang tidak umum untuk sebagian besar aplikasi. Jadi saya selalu berakhir menulis fungsi kustom untuk melakukan algoritma setengah-setengah yang lebih alami:
public static decimal RoundHalfUp(this decimal d, int decimals)
{
if (decimals < 0)
{
throw new ArgumentException("The decimals must be non-negative",
"decimals");
}
decimal multiplier = (decimal)Math.Pow(10, decimals);
decimal number = d * multiplier;
if (decimal.Truncate(number) < number)
{
number += 0.5m;
}
return decimal.Round(number) / multiplier;
}
Apakah ada yang tahu alasan di balik keputusan desain kerangka kerja ini?
Apakah ada implementasi built-in dari algoritma round-half-up ke dalam kerangka kerja? Atau mungkin beberapa API Windows yang tidak dikelola?
Ini bisa menyesatkan bagi pemula yang hanya menulis decimal.Round(2.5m, 0)
mengharapkan 3 sebagai hasilnya tetapi mendapatkan 2 sebagai gantinya.