문서의 이전 판입니다!
public int compare(final Number x, final Number y) { if(isSpecial(x) || isSpecial(y)) { return Double.compare(x.doubleValue(), y.doubleValue()); } else { // x, y의 class가 동일하다면 y.compareTo(y) 만하도록 처리하면 성능이 좋아질 수 있다. // x, y의 class가 다를 경우에만 BigDecimal로 변환한다. return toBigDecimal(x).compareTo(toBigDecimal(y)); } } private static boolean isSpecial(final Number x) { boolean specialDouble = x instanceof Double && (Double.isNaN((Double) x) || Double.isInfinite((Double) x)); boolean specialFloat = x instanceof Float && (Float.isNaN((Float) x) || Float.isInfinite((Float) x)); return specialDouble || specialFloat; } private static BigDecimal toBigDecimal(final Number number) { if(number instanceof BigDecimal) return (BigDecimal) number; if(number instanceof BigInteger) return new BigDecimal((BigInteger) number); if(number instanceof Byte || number instanceof Short || number instanceof Integer || number instanceof Long) return new BigDecimal(number.longValue()); if(number instanceof Float || number instanceof Double) // float,double은 toString을 통해 변환하는 것이 정확도가 더 높았다. return new BigDecimal(number.toString()); try { return new BigDecimal(number.toString()); } catch(final NumberFormatException e) { throw new RuntimeException("The given number (\"" + number + "\" of class " + number.getClass().getName() + ") does not have a parsable string representation", e); } }
isSpecial
이 없으면 Float
과 Double
의 NaN, infinite 상태에서 NumberFormatException
이 발생한다.BigDecimal
로 변환하지 말고 즉시 비교하고 리턴하는 코드를 추가할 것. 그러면 불필요한 객체 생성 변환이 없어 성능향상이 될 것으로 보인다.BigDecimal
로 변환한다.// Long 값을 16자리 Hex 문자열로 String hex = String.format("%016x", value);