2017-07-31 18 views
5

Używam commons-matem 3.6.1.Zaokrąglanie w matematyce podwójne

muszę zaokrąglić podwójnej wartości 2 przecinku

Przyjmijmy to moja podwójna wartość:

double d = 400.54540997260267; 

Teraz przez zaokrąglenie tej liczby Spodziewałem się jako rezultat 400.54

Zamiast jeśli mój numer był podwójny d1 = 400.54640997260267; Spodziewałem się wyniku 400.55

Teraz jestem śpiewać ten kod:

Precision.round(d, 2, BigDecimal.ROUND_DOWN); 

Jeśli używam jako roundingMethod BigDecimal.ROUND_DOWN zawsze uzyskać najniższą zaokrąglenia. Jakiego rodzaju metody zaokrąglania należy użyć, aby uzyskać to, czego szukałem?

Dziękuję Angelo

UPDATE

Nie undestand przyczynę downvoting Próbowałem poniższy kod:

public class TestCalcoli 

    { 
     private static final Logger logger = LoggerFactory.getLogger(TestCalcoli.class.getName()); 
     private void calc(double d) 
     { 
      double result = Precision.round(d, 2, BigDecimal.ROUND_HALF_DOWN); 
      double result2 = Precision.round(d, 2, BigDecimal.ROUND_HALF_UP); 
      logger.info("d--> "+d+" result --> "+result+" result2 --> "+result2); 
     } 
     @Test 
     public void calcola() 
     { 
      try 
      { 
       double d = 400.54540997260267; 
       double d1 = 400.54640997260267; 
       calc(d1); 
       calc(d); 
      } 
      catch (Exception e) 
      { 
       logger.error("errore", e); 
      } 
     } 
    } 

CONSOLE wyjściowa:

2017-07-31 09:29:44,608 317 [main] INFO i.e.c.r.pwb.test.TestCalcoli - d--> 400.54640997260265 result --> 400.55 result2 --> 400.55 
2017-07-31 09:29:44,612 321 [main] INFO i.e.c.r.pwb.test.TestCalcoli - d--> 400.54540997260267 result --> 400.55 result2 --> 400.55 

Wszystkie sugerowane odpowiedzi nie daje mi wynik Spodziewałem się więc czy istnieje coś mi brakuje lub wszystkie podane odpowiedzi nie były trochę zbyt pochopnie

+2

Zapewnienie kodu zdecydowanie pomaga, ale byłoby lepiej jako prosta aplikacja konsolowa z metodą "główną", aby była * trywialna * do uruchomienia (nie trzeba uruchamiać środowiska testowego) - i zawierała wyniki vs oczekiwane wyniki dla każdego z przypadków testowych. –

Odpowiedz

5

Należy użyć HALF_UP jeśli chcesz zaokrąglić w górę do tej samej odległości, tj cyfrę 5.

+1

Dlaczego ta odpowiedź ma tak dużo przebojów, jeśli nawet nie próbuje odpowiedzieć na pytanie OP? Czy przynajmniej przeczytałeś pytanie? OP chce czegoś dokładnie przeciwnego – xenteros

2

Oto dostępne metody zaokrąglaniu nadaje się do problemu i ich odpowiednie wyjście dla dwóch wartości:

Method    400.54540997260267 400.54640997260267 
--------------- ------------------ ------------------ 
ROUND_CEILING  400.55    400.55 
ROUND_DOWN   400.54    400.54 
ROUND_FLOOR  400.54    400.54 
ROUND_HALF_DOWN 400.55    400.55 
ROUND_HALF_EVEN 400.55    400.55 
ROUND_HALF_UP  400.55    400.55 
ROUND_UP   400.55    400.55 

Żadna z metod uzyskania oczekiwanych rezultatów.

Powodem tego jest fakt, że dwaj sąsiedzi: 400.54540997260267 i 400.54640997260267 to 400.54 i 400.55. Sąsiedzi nie są jednakowo równi od 400.54540997260267 lub 400.54640997260267. Dlatego też metody zaokrąglania wartości HALF zawsze dotyczą najbliższego sąsiada, który w obu przypadkach wynosi 400.55.

1

Najłatwiej osiągnąć to, co chcesz, aby wykonać następujące operacje:

double d = 400.54540997260267; 
Double temp = 1000*d; 
temp = 1.0*temp.intValue()/1000; 
Precision.round(temp, 2, BigDecimal.HALF_DOWN); 

Usuwa cyfry od 4 przecinku, a następnie wykonuje żądaną zaokrąglenia.