Konumuz yuvarlamalar. Round işlevi.
JavaScript'in matematik kafası bazı sayısal hesaplamalarda tam değer üretemiyor. Bunu gülümseyerek keşfettik. Firefox'ta da denedik efendim. Demek ki büyükler öyle istemişler. Neyse dedik o zaman kendimiz yuvarlayalım, son iki ondalık haneye göre. Aşağıdaki gibi bir kod yazmak zorunda kaldık:
Math.round((tutar*kur)*100))/100
Aynı hesabı C# ile sunucu tarafında da yapıyorduk. JavaScript'in hesapladığı tutar ile sunucuda hesapladığımızı karşılaştırıyorduk. Her şey güzel gidiyordu fakat arada sıra tek tük uyuşmazlık problemleri de çıkmıyor değildi.
Sonra bir gün yine bir uyuşmazlık problemi çıktığında, koştum değerleri elde ettim. Bu değerlerle uygulamayı denemeye başladık.
Ve yine acı acı gülümseyerek yeni bir şey keşfettik. Meğerse .NET içerisindeki Round işlevi, yuvarlamada diğer uygulamalara göre farklı bir standardı benimsemişti. Bu benimsenen standarda göre, bir ondalık hane, en yakın çift sayıya yuvarlanıyordu.
Örnek: Round(0.455) > 0.460 ve Round(0.465) > 0.460
Ve 0.005'li bir değere gelmiş kullanıcılar bu yuvarlamadaki anlayış farklılığından etkileniyor, uyuşmazlık mesajı alıyorlardı.
Vay canına!
Neticede adam gibi bir Round işlevine ihtiyacımız oldu. Bunu kullandık. Tavsiye ederim. Dikkatli olun:
public static double MyRound(double value)
{
int sign = Math.Sign(value);
double round = Math.Floor(Math.Abs(value) + 0.5);
return (sign * round);
}
public static double MyRound(double value, int digits)
{
int sign = Math.Sign(value);
double scale = Math.Pow(10.0, digits);
double round = Math.Floor(Math.Abs(value) * scale + 0.5);
return (sign * round / scale);
}