>

자바 코드에서 1 개의 입력이 있습니다 : 16275.874999999998

반올림 방법을 만듭니다 : 16275.87

그러나 정답은 16275.88입니다

자바에서 어떻게 수정합니까?

현재 반올림 방법 :

public static double round(final double value, final int places) {
    if (places < 0) throw new IllegalArgumentException();
    BigDecimal bd = BigDecimal.valueOf(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

편집 : 9s가 반올림하기 때문에 "올바른 답"은 .88이라고 생각했지만 사용중인 방법에서는 그렇지 않습니다. 이전 소수점을 고려하여 다시 작성해야합니다.

답장 해 주셔서 감사합니다!

  • 답변 # 1

    자바는 실제로 숫자를 올바르게 반올림합니다. 2 자리로 반올림하므로 setScale 메소드는 예제에서 4의 소수점 3 자리를 찾습니다. 4<5부터 HALF_UP 반올림 모드는 ROUND_DOWN처럼 작동하므로 출력은 16275.88 대신 16275.87입니다.

    숫자를 16275.88로 올림하려면 round(round(16275.874999999998, 3), 2) 와 같은 입력을 사용하여 메소드를 실행해야합니다.  

  • 답변 # 2

    항상 반올림하려면 RoundingMode.CEILING 를 사용해야합니다.  또는 RoundingMode.UP   RoundingMode.HALF_UP 대신 (음수의 작동 방식에 따라 다름)

       bd = bd.setScale(places, RoundingMode.CEILING);
    
    

    HALF_UP  삭제되는 첫 번째 소수점 자리에 5 이상이 있으면 반올림하고 해당 위치에서 5 미만이면 반올림합니다.

    CEILING  그리고 UP  16275.871은 16275.88로 반올림되므로 항상 양수로 반올림됩니다. 이 둘의 차이점은 음수를 처리하는 방법입니다. 와이즈 비즈  양수와 CEILING 를 향해 반올림  더 큰 음수로 반올림합니다.

    UP
    
    

    CEILING of -16275.871 = -16275.871 UP of -16275.871 = -16275.88

  • 이전 javascript - 모달 부트 스트랩에서 kendoDatePicker가 비활성화 된 이유
  • 다음 python - 반복을 사용하는 Kivy 드롭 다운 목록