1

Konu: Set Decimal ve Round İlişkisinde bir hata mı var?

Merhaba,
Decimal ile Round fonksiyonları arasında acaba bir hata mı var yoksa ben yanlış mı kullanıyorum.
Aşağıdaki kodda yuvarlama yanlış oluyor.

Visual Fox Pro
Clear

Set Decimals To 6
Create Cursor curIskontoOranlari(nOran B(2))
Insert Into curIskontoOranlari Values(10)
Insert Into curIskontoOranlari Values(5)
Insert Into curIskontoOranlari Values(3)
Local lnTutar As Double
Go Top In curIskontoOranlari
m.lnTutar = 100
Do While !EOF("curIskontoOranlari")
    m.lnTutar = m.lnTutar - (m.lnTutar * curIskontoOranlari.nOran / 100)
    Skip In curIskontoOranlari
EndDo
? "Yuvarlamadan önceki değer" && 17,06500000000000
? 100 - m.lnTutar
m.lnTutar = Round(100 - m.lnTutar, 2)
? "Yuvarlamadan sonraki değer" && 17,06
? m.lnTutar

Ancak Set Decimal To 6 değerini Set Decimal To 2 olarak değiştirdiğimde sonuç doğru çıkıyor.

Visual Fox Pro
Clear

Set Decimals To 2
Create Cursor curIskontoOranlari(nOran B(2))
Insert Into curIskontoOranlari Values(10)
Insert Into curIskontoOranlari Values(5)
Insert Into curIskontoOranlari Values(3)
Local lnTutar As Double
Go Top In curIskontoOranlari
m.lnTutar = 100
Do While !EOF("curIskontoOranlari")
    m.lnTutar = m.lnTutar - (m.lnTutar * curIskontoOranlari.nOran / 100)
    Skip In curIskontoOranlari
EndDo
? "Yuvarlamadan önceki değer" && 17,06500000000000
? 100 - m.lnTutar
m.lnTutar = Round(100 - m.lnTutar, 2)
? "Yuvarlamadan sonraki değer" && 17,07
? m.lnTutar

VFP9 kullanıyorum acaba decimal olayını iyi kavrayamadım da yanlış mı düşünüyorum yoksa bir hata mı var?

/o---------------------o\
     www.haser.com
\o---------------------o/

2 Son düzenleyen, taRKan (03.09.2007 10:28:15)

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Bu arada şunu da keşfettim.
Ondalık sayısı 12 ve üzeri için Round fonksiyonu yanlış çalışıyor.

Visual Fox Pro
Set Decimals To 2

? Round(100 - 82.93500000000, 2) && Ondalık 11 haneli 17,07
? Round(100 - 82.935000000000, 2) && Ondalık 12 haneli 17,06
Set Decimals To 6
? Round(100 - 82.93500000000, 2) && Ondalık 11 haneli 17,07
? Round(100 - 82.935000000000, 2) && Ondalık 12 haneli 17,06
/o---------------------o\
     www.haser.com
\o---------------------o/

3 Son düzenleyen, ugurlu2001 (03.09.2007 11:04:32)

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Merhaba Tarkan Hocam;

Aşağıdaki Şekjilde doğru biçimde çalışıyor.

Visual Fox Pro
Clear

Set Decimals To 6
Create Cursor curIskontoOranlari(nOran N(12,6))  && Numeric 12 Hane, 6 Basamak Duyarlıklı
Insert Into curIskontoOranlari Values(10)
Insert Into curIskontoOranlari Values(5)
Insert Into curIskontoOranlari Values(3)
Local lnTutar As Double
Go Top In curIskontoOranlari
m.lnTutar = 100
Do While !EOF("curIskontoOranlari")
  m.lnTutar = m.lnTutar - (m.lnTutar * curIskontoOranlari.nOran / 100)
  Skip In curIskontoOranlari
EndDo
? "Yuvarlamadan önceki değer" && 17,06500000000000
? 100 - m.lnTutar
m.lnTutar = Round(100 - m.lnTutar, 6) && Duyarlık 6 Hane
? "Yuvarlamadan sonraki değer" && 17,06
? m.lnTutar
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Ben sonucu 6 ondalık olarak istemiyorum 2 ondalıklı istiyorum. Dolayısıyla,
m.lnTutar = Round(100 - m.lnTutar, 6) olarak kullanamam.
m.lnTutar = Round(100 - m.lnTutar, 2) olarak kullanmam lazım.
Senin gönderdiğin kodda 2 ondalıklı olarak istediğimde de sonuç hatalı.
Keza ben sorunu
m.lnTutar = Round(100 - Round(m.lnTutar, 6), 2) olaran çözdüm ama bu işte bir gariplik var.

/o---------------------o\
     www.haser.com
\o---------------------o/

5 Son düzenleyen, ugurlu2001 (03.09.2007 11:21:44)

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

taRKan yazdı:

Bu arada şunu da keşfettim.
Ondalık sayısı 12 ve üzeri için Round fonksiyonu yanlış çalışıyor.

Visual Fox Pro
Set Decimals To 2

? Round(100 - 82.93500000000, 2) && Ondalık 11 haneli 17,07
? Round(100 - 82.935000000000, 2) && Ondalık 12 haneli 17,06
Set Decimals To 6
? Round(100 - 82.93500000000, 2) && Ondalık 11 haneli 17,07
? Round(100 - 82.935000000000, 2) && Ondalık 12 haneli 17,06


Visual Fox Pro
* Aşağıdaki kullanım biçiminde olsa, olmaz mı?

Set Decimals To 6
? ROUND(100 - 82.93500000000, 6)
? Round(100 - 82.935000000000, 6)

Tarkan Hocam sorun sadece senin sorunun değil, Microsoft da böyle bir sorunun varlığını kabul ediyor.

aşağıdaki linkleri bir incele istersen

http://support.microsoft.com/kb/157954

http://msdn2.microsoft.com/en-us/librar … s.71).aspx

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

6

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Ben galiba sorunu eksik yazdım smile
Ben sonucu 2 ondalık olarak istiyorum.
100 - 82.935 = 17.065 çıkar
Bu değeri 2 ondalığa yuvarlarsak 17.07 çıkar
Ancak yukarıda yazmış olduğum kodlarda sonuç 17.06 olarak çıkıyor. Bu yanlışık neden oluyor onu sorguluyordum.

/o---------------------o\
     www.haser.com
\o---------------------o/

7

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Tarkan,
Olay real degerlerin hafizadaki tutlma sekliyle ilgili ve VFP'nin sucu yok. IEEE isin asil sorumlusu. B(2) yerine Y kullan veya hesaplamalarda ntom() o zaman sorunun kalmaz. Real deger goruntude  17.065 olsa da 17.06499... IEEE spesifikasyonuyla ne yazikki durum boyle.

Mesela bunu hemen C# versiyonuyla karsilastirdim sonuc 17.06 smile

"set decimal to 2" ile duzgun gordugun sonuc hesabin yapilis sekline bagimli bir yontem. O nedenle ntom() veya Y kullan. Ornek:

Visual Fox Pro
Clear

Set Decimals To 6
Create Cursor curIskontoOranlari(nOran b(10))
Insert Into curIskontoOranlari Values(10)
Insert Into curIskontoOranlari Values(5)
Insert Into curIskontoOranlari Values(3)
Local lnTutar As Double
m.lnTutar = 100
select curIskontoOranlari
scan
  m.lnTutar = m.lnTutar * (1 - curIskontoOranlari.nOran / 100)
Endscan
? "Yuvarlamadan önceki deger" && 17,06500000000000
? (100 - m.lnTutar)
 
? "NTOM() deger" && 17,07
? Round(NTOM(100 - m.lnTutar), 2)
 
m.lnTutar = Round(100 - m.lnTutar, 2)
? "Yuvarlamadan sonraki deger" && 17,06
? m.lnTutar

Senin hesapla ayni sey sadece yontem farkli ve tamamen dogru bir matematik. Decimals 2 de yapsan sonuc 17.06

8

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Hay Allah,
Şimdi açıkladığın şey beni korkuttu. Programımın bir çok yerinde bu round fonksiyonunu kullanıyorum. Acaba tamamının başına NTOM fonksiyonunu eklemeli miyim?

Belki birçok kod için NTOM gereksiz olacak ama başka bir şekilde bu işi garantiliyemem galiba. sad

/o---------------------o\
     www.haser.com
\o---------------------o/

9

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Ha bu arada b(10) yazmisim. Farketmez b(1) ya da b(10) sen ne yazarsan yaz saklanan deger 8 byte real deger. b(1), b(10) sadece gorsel olarak etkiliyor.

10

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Evet parasal islemlerde baska yolu yok. Ya alanlarin Y olacak ya da Ntom() kullanacaksin. IEEE'ye guven olmaz:)

11

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Teşekkür ederim.
Ben formlara dönüp gerekli düzenlemeyi yapayım. sad

/o---------------------o\
     www.haser.com
\o---------------------o/

12

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

cetinbasoz yazdı:

Evet parasal islemlerde baska yolu yok. Ya alanlarin Y olacak ya da Ntom() kullanacaksin. IEEE'ye guven olmaz:)


evet ama başka bir yerde currency kullanmayın, bazı problemleri var dediğini hatırlıyorum. ben mi yanlış hatırlıyorum? yoksa fikrin mi değişti?

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

13

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Baska yere bagli demissem:) Sanirim N kullanmayin, kullanmak zorundaysaniz hic olmazsa F kullanin demisimdir.

14

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

cetinbasoz yazdı:

Baska yere bagli demissem:) Sanirim N kullanmayin, kullanmak zorundaysaniz hic olmazsa F kullanin demisimdir.


hiç beklenmedik rakamlar çıkabiliyor hesaplamalarda. öyle demiştin.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

15

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Dedigim yeri gormem lazim. Berarinde birseyler vardir o zaman. Bir gorsem neden dedigimi hatirlarim:)

16

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

ya galiba sql serverdaki money türü için demiştin. sad

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

17

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

cetinbasoz yazdı:

Dedigim yeri gormem lazim. Berarinde birseyler vardir o zaman. Bir gorsem neden dedigimi hatirlarim:)


dediğin yeri buldum. foxpro'daki numeric için demişsin... smile

http://www.fox4um.com/viewtopic.php?id=969

az önce yeni bir programda money kullanmaya karar verdiğim için son bir kez kontrol edeyim dedim ve buldum...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

18

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

Iyi de orada currency kullanmayin dememisim, tam tersine kullanin demisim:)

19

Re: Set Decimal ve Round İlişkisinde bir hata mı var?

cetinbasoz yazdı:

Iyi de orada currency kullanmayin dememisim, tam tersine kullanin demisim:)


e işte benim aklımda böyle kalmış... hihi...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com