Hafif Java ondalık Sınıf

oy
12

Ben BigDecimal iki sınırlı hassas alternatifleri, yani DecimalInt ve DecimalLong yazma düşünüyorum. Bunlar hem değişken ve değişmez biçimde creatable ondalık basamağa, keyfi bir sayı ile int ve uzun gerçek sınırları içinde sayılarla başa çıkabilecek olurdu. Planım en fazla 18 hane ile ancak, DecimalInt desteği +/- 999999999 0.999999999 olarak +/- yapıp aynı DecimalLong etmektir.

Bu tarafında DecimalLong için ölçekli bir int ya da uzun saklanan gerçek değeri DecimalInt için 0-9 ve 0-18 bir ondalık haneli sayısı değeri muhafaza yapılabilir olacaktır. Normal kullanım böyle para ve hisse senedi fiyatları, normalde 2-4 ondalık basamağa gelince ondalık küçük sayılar için olurdu.

Temel gereklilikler (a) yağsız ayak izi (2 sınıfları artı OverflowException) ve tüm temel işlemleri (b) tam destek artı mantıklı Math tümü.

sonuçlar için Googling herhangi bariz hit dönmedi - hepsi keyfi ondalık ilgilendirmeyen gibiydi.

Sorularım eder: Bu zaten yapıldı mı? Zaten yapılmamış bir neden olduğu bu incelikleri var gizlidir? DotNet en gibi bir ondalık türü destekleyen Java herkes duydu söylentiler vardır.

DÜZENLEME: olması gerektiği, çünkü bu BigDecimal farklıdır (a) ints dizisi ile uğraşmak değil, ve çok belleğe yalın olacak böylece (b) BigInteger sarmak olmayacak, daha verimli bir fazlabirşey ve daha hızlı orada yanı olacak böylece (c) bir değişken seçeneğine sahip olacak. Özetle - gibi basit kullanım durumları için daha az ek yük Ben BigDecimal düzenleme yükü ve çift yanlışlık olmadan bir banka dengesini saklamak istiyorum.

DÜZENLEME: 1586,60-708,75 = 877.8499999999999 yerine 877,85: Ben klasik sorunu önlemek için int veya uzun kullanarak tüm matematik yapmak niyetinde

Oluştur 09/12/2008 saat 21:05
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
12

Kesinlikle bu yapılmamışsa sebebi BigDecimal ve BigInteger havai sandığın kadar ilgili olmadığını şüpheli ve çaba ve bazı ince bir şekilde yanlış yakalanma riski değmez bundan kaçınır.

senin örneğini kullanmak için: herhangi bir mali uygulama için, birkaç düzine bayt tasarrufu olmayan bir konu ve sınırlı hassas bir anlaşma kırıcı olduğunu (hisse senedi fiyatları ABD'de genellikle 2-4 basamak var, ama Gözat sen gelişmekte olan piyasalarda başa istiyorsanız , bir 15 haneli toplamı size ekmek yarım somun) satın kaçak enflasyon ile para karşılaşacaksınız.

Temelde, prematüre optimizasyon sadece başka bir durumda gibi geliyor.

Cevap 11/12/2008 saat 11:39
kaynak kullanıcı

oy
1

hataları yuvarlama özellikle ilgilenen çoğu kişi BigDecimal ve BigInteger çoğu durumda yeterince iyi performans gösterdiğini kullanın.

Ancak olgular performans yuvarlama ile çift işi yapar kullanarak, daha kritik olduğu. Bu genellikle yeni başlayanlar tarafından unutulur, ama sadece mantıklı turda olmadan çift sonuç almak ve mantıklı bir cevap almak için bekleyemezsiniz.

Vakaların büyük çoğunluğu yuvarlama ile iki katına olarak tüm ihtiyaç vardır.

System.out.printf("%.2f%n", 1586.60-708.75);

baskılar

877.85
Cevap 24/11/2010 saat 00:03
kaynak kullanıcı

oy
0

Eğer para işlemek için ondalık basamak sabit, az sayıda bakıyor, o zaman bu genellikle tamsayı (uzun gerekirse) sent sayılar veya bir yüzde hundredths tutarak yapılır.

Eğer para ile ilgili varsa o zaman nasıl yuvarlama tanıtıcı dikkatli olmak gerekir. senin hesaplamalar denetlenecek yapacaksanız orada bu tür bir şey nasıl yapılır için kurallardır. Ayrıca Biraz işlemleri (bölme bilinen bir örneğidir) tam yapılamaz farkındayız varsayalım.

Cevap 10/12/2008 saat 15:38
kaynak kullanıcı

oy
0

Odağınızın taşınabilir cihazlar için ise bakmak Real, . Gerçek sağlayan hassas MIDP cep telefonları için tasarlanmıştır 16 0'dan ayarlanmasına numarasının.

Ayrıca ilgi bakmak yapıcı realse kütüphanede. Gerçi hafif değil.

Aşağıdaki yoruma istinaden, kullanmak olamaz Apache Commons Matematik Kütüphanesi fraksiyonları ile çalışmak? Işe yaramaz bir sebep mi var?

Cevap 09/12/2008 saat 21:31
kaynak kullanıcı

oy
-1

Daha sonra Keyfi hassas istiyorsanız mantis temsil etmek bit tanımlanmamış bir numara ihtiyacımız olacak geliyor bana. Bu dizi tahsisi stratejisinin bir çeşit mantis için gerekli olacak demektir. Burada kendi üretebilir, ancak BigInteger oldukça verimli bir şekilde yapar ve işe yarıyor

Eğer temsil etmek gerek en küçük (sıfır olmayan) değerinin ne belirtmeniz gerekir. n + 1 üs tahsis bitlerin sayısı (2 ^ n), - Bu, 10 ^ olacaktır. (2 ^ 31) - BigDecimal ile bu 10 ^ olduğu. Sen keyfi bir boyut üs kullanabilirsiniz, ancak bu menzil kimse için yeterli olmalıdır.

Yani ne gerek size Keyfi hassas vermek için sınırsız bir tamsayı mantis ve sabit boyutlu üs size asgari temsil edilebilir değer olmasını istediğinize bağlı vardır. Esas olarak, bu BigDecimal olduğu; Tek değişiklik BigDecimal tarafından kullanılan int yerine bazı küçük nesneyi kullanacak olan. Uzay tasarruf buna değer mi şüphe ederim. Ben BigDecimal kendinizin zanaat herhangi bir çözümün daha zor artık bellek kullanımı ile gerekenleri yapacak düşünürdüm.

Elbette ihtiyacınız olacak önemli rakamların maksimum sayıda seçebilir; o zaman mantisi ve üstü her ikisi için sabit boyut depolama gerekir ve bu bir sürü daha az depolama var. Sadece mantis uzun mamul sabit sayıda kullanın.

Cevap 09/12/2008 saat 23:43
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more