현재 나는이 방법이 있습니다double에 소수점 이하 n 자리가 있는지 확인하는 방법?
static boolean checkDecimalPlaces(double d, int decimalPlaces){
if (d==0) return true;
double multiplier = Math.pow(10, decimalPlaces);
double check = d * multiplier;
check = Math.round(check);
check = check/multiplier;
return (d==check);
}
을하지만이 방법은 제가 기본이 수에 기본 10 수학을 아마 때문에 checkDecmialPlaces(649632196443.4279, 4)
실패합니다.
어떻게이 검사를 올바르게 할 수 있습니까?
double 값의 문자열 표현을 얻은 다음 regexp를 사용하여이를 확인했습니다.하지만 이상하게 느껴졌습니다.
편집 : 모든 답변 주셔서 감사합니다. 이 정말 더블을받을 경우는 그 경우에 나는 다음을 구현 :
private static boolean checkDecimalPlaces(double d, int decimalPlaces) {
if (d == 0) return true;
final double epsilon = Math.pow(10.0, ((decimalPlaces + 1) * -1));
double multiplier = Math.pow(10, decimalPlaces);
double check = d * multiplier;
long checkLong = (long) Math.abs(check);
check = checkLong/multiplier;
double e = Math.abs(d - check);
return e < epsilon;
}
가 나는 절단에 round
을 변경했습니다. round
에서 수행 된 계산은 부정확도를 너무 많이 증가시키는 것으로 보입니다. 적어도 실패한 테스트 케이스에서. 내가 확인하고 내가했던 BigDecimal
를 사용해야하는 '진짜'문자열 입력을받을 수 있다면 당신의 일부로서
지적 :
BigDecimal decimal = new BigDecimal(value);
BigDecimal checkDecimal = decimal.movePointRight(decimalPlaces);
return checkDecimal.scale() == 0;
내가 얻는 double
값은 아파치 POI의 API에서 제공하는 읽기는 파일을 능가합니다. 나는 몇 가지 검사를하고 API가 숫자 세포에 대한 double
값을 반환하지만 나는 즉시 double
DecimalFormat
에 있음을 포맷 할 때 나는 정확한 표현을 얻을 수 있다는 것을 발견 :
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumIntegerDigits(Integer.MAX_VALUE);
// don't use grouping for numeric-type cells
decimalFormat.setGroupingUsed(false);
decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
value = decimalFormat.format(numericValue);
이 또한 값을 작동 할 수 없습니다 정확하게 이진 형식으로 표현됩니다.
에 대한 값을 심문 "제대로"많은 여기에 의미하지 않는다. 임의의 십진수에는 정확한 이진 표현이 없습니다. 당신은 10 진수를 찾고 있습니다. 그래서 사람들은 10 진수의 이진 값을 좋아할 것입니다. 가까운 거리에 얼마나 가까이 있습니까? –