2010-01-21 24 views
5

Sitemde on basamaklı ondalık basamaklı (ondalık) kayan nokta sayılarını gösteren bazı girdiler var. Bir noktada, müşteri tarafındaki doğrulama kodunda, bu değerlerin bir çiftini eşit olup olmadığını görmek için karşılaştırmalıyım ve beklediğiniz gibi, IEEE754'ün iç yapısı, bu gibi basit kontrollerin başarısız olmasını sağlar. 2.0000000000 == 2.0000000001) = true.Keyfi Kesinlik JavaScript'deki Float numaralar

Noktaların her iki tarafındaki kayan nokta sayısını ikiye bölebilir, her tarafı 64 bit uzunluğa getirebilir ve karşılaştırmaları el ile yapabilirim, ancak çok çirkin görünüyor!

Javascript'te keyfi (veya en azından garantili) hassas float numaralarını işlemek için uygun bir Javascript kitaplığı var mı?

Şimdiden teşekkürler!

Not: Bir GWT bazlı solüsyon http://code.google.com/p/gwt-math/ de GWT-MATH kütüphane bulunmaktadır bir ++

+0

Bu sorun HERHANGİ herhangi bir keyfi doğrulukta kayan nokta üzerinde görünebilir, aksi halde eşitlik için hassaslığı ayarlarsınız. Bu, kayan noktalı sayıların öz doğasıdır. Rasgele uzunlukta sabit nokta matematik kullanın. – kirilloid

+0

@kirilloid elbette görünebilir, sadece soruyu detaylandırmaya değer olduğunu düşündüm (genellikle daha ayrıntılı cevaplara yol açar). Yine de teşekkürler! – opsidao

cevap

1

sahiptir.

Ancak, bu java.BigDecimal bir java-> javascript otomatik dönüştürme (aslında eski com.ibm.math.BigDecimal) bir Gwt jsni bindirme var, sizi uyarır.

Çalışıyor, ancak hızlı değil. (Ne de olsa yalın. Projenize iyi bir 70k yastık olacak).

İşyerinde, sabit bir nokta üzerinde basit bir ondalık üzerinde çalışıyoruz, ancak henüz yayınlanmaya değecek hiçbir şey yok. :(

+1

umut verici görünüyor! Teşekkürler! (Performansın bir sorun olacağını düşünmüyorum, yalnızca doğrulama için, gerçek matematik R; kullanılarak sunucuda yapılır))) – opsidao

1

depolamak ve rasgele herhangi boyutta tamsayılar ile hesaplayabilirsiniz hangi tür silentmatt’s javascript-biginteger olarak keyfi hassas tamsayı kitaplığı kullanın.

on ondalık basamak istiyorum olduğundan, n×10^10 olarak değerini n saklamak gerekir Örneğin, 110000000000 (on sıfır), 1.515000000000 (dokuz sıfır), vb. Olarak depolayın. Değeri kullanıcıya göstermek için ondalık karakterin önüne bir ondalık nokta koyun ve sonra eğer isterseniz sıfırlar)

Alternatif olarak Bir pay ve paydayı biginteger olarak depolayabilir, bu da size rasgele kesin kesirli değerlere izin verir (ancak dikkat - kesirli değerler çok hızlı bir şekilde çok büyük olma eğilimindedir).