Aslında bu konu tam sayılar ile işlem yaparken lazım ve
Ali hocanın şurada (http://ddili.org/forum/thread/716) bahsettiği konudan tamamen uzak...
Alt Konular: Yuvarlama ve .0'ın acımasızlığı...
Bugün Japon Bayrağı'nı doğru şekilde ekrana yansıtmanın ve bu ülkenin bayrağına saygılı davranmanın önemli olduğu düşüncesiyle ortadaki yuvarlağın (armanısının) oranını araştırdım. Ancak koda döktüğümde yanlış hesapladığını gördüm. Bunu hemen aşağıda örnekleyeyim:
void main() {
enum xH = 400; // Yükseklik (boy)
enum xW = xH * 1.5; // Genişlik (en)
int yanlış = (xH/(5/3))/2;
int çapJapon_Bayrağındaki_Yuvarlak = cast(int)((xH/(5/3.0))/2.0);
alias çapJapon_Bayrağındaki_Yuvarlak doğru;
doğru.writeln(" = doğru değer");
yanlış.writeln(" = yanlış değer");
}
Bu kodun iki çıktısı var:
Doğru değer 120
Yanlış değer ise 200, fark 80 ki doğru sonucun 3'de 2'si demek!
Elbette sebebi 5/3 oranın 2'ye çok yakın olması ve integer veri türünde tıpkı .0 kullanmayı (virgülden sonra 0 yazmayı) ihmal etmemiz gibi bir etki yapmasıdır. Yani çok da büyük bir sürpriz değil...:)
Bu konu aklımızın bir köşesinde dursun ama şimdi yuvarlamaya girelim:
Alıntı:
>> enum xH = 333; // Yükseklik (boy)
>
> /*Çıktısı:
> 99 = doğru değer
> 166 = yanlış değer
> */
> ```
Eğer xH'ın yukarıdaki gibi olması durumunda bu sefer de tür dönüşümlerinin azizliğine uğruyoruz! Çünkü doğru sonuç 99,99 ve bence bu yuvarlanmalı. O yüzden, siz siz olun, bu tür dönüşümlerde kodunuza 'lround()' işlevini eklemeyi ihmal etmeyin:
writeln(cast(int)(lround((xH/(5/3.0))/2.0))); // 100
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]