2014-05-20 10 views
5

Küçük bir fizik uygulaması yazıyorum. Yapmayı planladığım sayıyı yuvarlamak. Sorun, sabit bir yuvarlama değil, ondalık basamakların değerine bağlı olan değişken bir yuvarlamadır. Konuyla ilgili bir açıklama yapacağım.Java'da, bu tür numaralandırmalara nasıl ulaşılır?

  • Her zaman tamsayı bölümünü (varsa) ve ilk beş ondalık basamağı (varsa) tutmam gerekir.
  • yarim yuvarlama her zaman kullanilir.

    21,1521421056 Sonuç daha sonra sadece ondalık basamak oluşuyorsa 21,15214
    34,1521451056 34,15215

  • olur olur:

    • ilk beş basamaklı olmayan sıfır basamak daha sonra onları tutmak eklerseniz.

      0,52131125 0,52131
      0,21546874 ilk beş basamaklı tamamı sıfır basamak 0.00000 sonra sıfırdan basamak dahil ilk beş basamak inmek ise 0,21547
      0,00120012 0,0012

    • olur hale dönüşür.

      0,0000051234 0,0000051234
      0,000000000000120006130031 benim ihtiyaçları için bir gerekliliktir, çünkü BigDecimal ile çalışırken bu yuvarlama oynamaya ihtiyacı

0.00000000000012001 dönüşür.

+4

görünüyor ama yanılıyor olabilirim. – Christian

+0

Bazı kodlamaları yapmak zorunda kalmanız için tek sayı olduğunu kabul ediyorum ... ama 'BigDecimal' bunun için iyi bir temel; Ölçeği, değerlere göre ihtiyaç duyduğunuz şeye ayarlayın. – SJuan76

+0

@Cruncher> sıfırdan birinci sırayı> 4 basamak> açıklamamla tutarlıdır; sıfır basamak içermeyen ilk beş basamak (noktadan sonra). o zaman sorun yok. –

cevap

4

I çalışmalıdır yapmak Ne istediğinizi doğru anlarsam, bunun işe yaradığını düşünüyorum. d numarasını içeren bir BigDecimal ise: Eğer, ben yuvarlama bu özel tür (yapmak için bir yöntem var olduğunu düşünmüyorum (kendi kod yazma) elle yapmak zorunda olacak gibi

BigDecimal rounded = d.round(new MathContext 
    (d.scale() - d.precision() < 5 
     ? d.precision() - d.scale() + 5 
     : 5)); 
+0

Vay, bunun işe yarayacağına inanamıyorum. Lütfen bunu iyi bir cevap vermek için bir açıklama yapın. Özellikle “scale()” ve “precision()” üzerindeki belgeler mükemmel olmadığından daha azdır. – Cruncher

+1

@Cruncher Ben de bu yöntemleri anlamıyorum. Çıktıyı yeni MathContext parametresinin çeşitli değerleri için terk ettim ve hangisinin işe yarayacağını ve formülün nasıl görüneceğini anladım. – ajb

+0

İlk bakışta BigDecimal'in dahili uygulamasında kullanıldıklarını düşünüyorum ve yazarlar bunu halka açık bir kaynak olarak sunabileceklerine karar verdiler. Ve iyi bir dokümantasyon yazmaya karar vermedi. (unscaledValue ölçekle tanımlanır ve ölçek unscaledValue tarafından tanımlanır) – Cruncher

-2

Bu, aradığınız şey nedir?

public static void main(String[] args){ 
    double d = 0.000000000000120006130031; 

    System.out.println(round(d, 5)); 
} 

private static double round(double d, int precision) { 
    double factor = Math.pow(10D, precision); 
    int value = (int)d; 
    double re = d-value; 


    if (re * factor <= 0.1 && d != 0) { 
     while (re * factor <= 0.1) { 
      factor *= 10; 
     } 
     factor *= Math.pow(10D, precision); 
    } 
    re = ((int)(re*factor))/factor+value; 

    return re; 
} 

(üzgün, biraz çabuk & kirli, ama isterseniz, bunu artırabilir)

DÜZENLEME: o <= koşullarda, bu daha iyi

+1

OP, "Float" değil "BigDecimal" ile çalışması gerektiğini açıkça belirtti –

+0

@JimGarrison BigDecimals'ı çoğaltmak ve bölmek için birkaç yöntem vardır, bu nedenle kodun gereksinimlerine göre yeniden kodlanması kolay olmalıdır. Daha fazla okuma: http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html # multiply (java.math.BigDecimal) – desperateCoder