Muhammed Tahiroğlu yazıyor
Yazılım ve Sanat

JavaScript ve .NET Arasında Yuvarlanmak

Temmuz 19, 2006 05:57, Muhammed

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); 
}

Related posts

Yorumlar

Eylül 18. 2007 13:29

Gravatar

Selamlar, birkac sene once ben de benzer bir sorunla karsilasmis ve gozlerime inanamamistim. Malesef rounding her yerde ayni rounding degil.

http://www.yazgelistir.com/Makaleler/1000000841.ygpx linkinde ben de goruslerimi paylasmistim.

Kivanc OzuolmezÂ

Yorum ekle


(Gravatar simgesini gösterecek)  

  Country flag




 
EOS 40D
Site Meter