2011-07-05 33 views
5

Javascript ile bütçe uygulaması oluşturuyorum. Javascript'in operasyonların çoğunu yapmasına izin vermeliyim. Dolayısıyla, kullanıcının bir kategori için istenen miktarı değiştirdiği bazı denetimlerim var ve uygulamam alt kategoriler için yeni miktarları gösteriyor. Ben Yani varsa + Otomatik $ 50.23 - Kullanıcı, 90.00 ile Gaz, Bakım, Sigorta, vb miktarları Auto 50.23 değişir ...javaScript ile Para birimi işlemleri?

Yani eğer - Gaz $ 30.25 - Bakım $ 6.27 - $ 10.02 Sigorta Ebeveyn kategorisindeki% artışı yansıtacaktır.

Sorun şu ki, birkaç işlemden sonra hassaslığı kaybediyorum ve bazı hatalar yaratıyor. Sayıların çoğu zaman eklemez (gerektiği gibi). Otomatik miktarını birkaç kez değiştirdikten sonra 0'a ayarladıktan sonra, diğer miktarlar her zaman 0'a gitmez ve bazen 0'ın altına giderler ve daha sonra bir NaN verirler. NaN NaN'de kalacak.

Birinin, javascript'teki kesirlerin bir başka problem olan yaklaşık değerler olduğunu söylediğini duydum. Bunun bir gerçek olup olmadığını görmek için google'ı denedim, ancak hiçbir şey bulamadım (belki doğru terimleri aramamıştım)

Bazılarınızın benzer problemlerle karşılaştığından emin olabilirsiniz. önermek? Biri orijinal numaramı 100 ile çarpmayı önerdi ve daha sonra tüm işlemleri yaptı, ama korkarım ki bu, hassasiyeti kaybetme probleminden kurtulmam için bana yardımcı olmayacaktır.

Herhangi bir fikrin var mı?

Yardımlarınız için minnettar olacağım!

+0

JS'deki her sayı bir kayan nokta sayısıdır, ancak 2-yer numaralarında çok fazla hassasiyet kaybetmemelisiniz. FP yuvarlama bir sorun haline gelmeden önce, kelimenin tam anlamıyla binlerce veya milyonlarca yinelemeye ihtiyacınız var. Hesaplamalarınızı yaptığınız yerde kodunuzun ilgili kısmını gösterebiliyor musunuz? Bütün sayfaya ihtiyacımız yok, sadece bu küçük. –

+0

de muhtemelen kendi sınıfınızı dolar ve sent (tüm tamsayı) gibi özelliklerle oluşturabilir ve kendi işlemlerinizi gerçekleştirebilirsiniz. – spacevillain

+0

fp ekleme hataları javascript'te en sık bildirilen hatalardır. – jzilla

cevap

9

İkilik kayan noktalı sayılar ondalık kesirleri işlemede en iyi durumdadır, bu nedenle 0,1 + 0,2, 0,3'e eşit değildir. Bu, JavaScript'te en sık bildirilen hatadır ve İkili Kayan Nokta Aritmetiği için IEEE Standardını (IEEE 754) benimsemenin kasıtlı bir sonucudur. Bu standart, birçok uygulaması için çok uygundur, ancak ortaokuldaki sayılar hakkında öğrendiğiniz şeylerin çoğunu ihlal eder. Neyse ki, kayan noktadaki tamsayı aritmetiği kesin, bu nedenle ölçekleme ile ondalık gösterim hataları önlenebilir. Örneğin, dolar değerleri 100 ile çarpılarak bütün sent değerlerine dönüştürülebilir. Daha sonra sentleri doğru şekilde eklenebilir. Toplam 100 dolara geri dönüştürülebilir. İnsanların, sonuçların doğru olacağına karar verdiklerinde makul beklentisi vardır.

"JavaScript: The Good Parts, Douglas Crockford. Telif Hakkı 2008 Yahoo! Inc., 978-0-596-51774-8."

3

Her zaman para birimi ile tam olarak dahili olarak takip edin. Bütün işlemler tam sayılarla yapılmalıdır. Sadece gösterim için ondalık var. Parayı takip etmek için ondalık puan kullanmayı düşünüyorsanız,

check out this fiddle.

+0

İşte güncelleştirilmiş keman: http://jsfiddle.net/PfPbt/15/ nerede fark ve önerilen çözümü görebilirsiniz. –

İlgili konular