나는 실제로 여기에 대한 답변을 찾을 수 없다는 것에 놀랐습니다.하지만 잘못된 검색어 나 무언가를 사용하고있을 수도 있습니다. 내가 찾을 수있는 가장 가까운 것은 this 이지만 double
특정 단계 크기의 특정 범위를 생성하는 것에 대해 묻고 답변은 그것을 그렇게 취급합니다. 임의의 시작, 끝 및 단계 크기로 숫자를 생성하는 것이 필요합니다.
나는이 그림 이 어딘가에 이미 도서관에서이 같은 몇 가지 방법으로,하지만 쉽게 찾을 수 없습니다 만약 그렇다면 (다시, 아마 난 그냥 잘못된 검색어 또는 무언가를 사용하고 있습니다). 마지막 몇 분 동안 직접 요리 한 내용은 다음과 같습니다.
import java.lang.Math;
import java.util.List;
import java.util.ArrayList;
public class DoubleSequenceGenerator {
/**
* Generates a List of Double values beginning with `start` and ending with
* the last step from `start` which includes the provided `end` value.
**/
public static List<Double> generateSequence(double start, double end, double step) {
Double numValues = (end-start)/step + 1.0;
List<Double> sequence = new ArrayList<Double>(numValues.intValue());
sequence.add(start);
for (int i=1; i < numValues; i++) {
sequence.add(start + step*i);
}
return sequence;
}
/**
* Generates a List of Double values beginning with `start` and ending with
* the last step from `start` which includes the provided `end` value.
*
* Each number in the sequence is rounded to the precision of the `step`
* value. For instance, if step=0.025, values will round to the nearest
* thousandth value (0.001).
**/
public static List<Double> generateSequenceRounded(double start, double end, double step) {
if (step != Math.floor(step)) {
Double numValues = (end-start)/step + 1.0;
List<Double> sequence = new ArrayList<Double>(numValues.intValue());
double fraction = step - Math.floor(step);
double mult = 10;
while (mult*fraction < 1.0) {
mult *= 10;
}
sequence.add(start);
for (int i=1; i < numValues; i++) {
sequence.add(Math.round(mult*(start + step*i))/mult);
}
return sequence;
}
return generateSequence(start, end, step);
}
}
이 메소드는 간단한 루프를 실행 step
하여 시퀀스 인덱스를 곱하고 start
오프셋에 추가합니다 . 이는 연속 증분 (예 : step
각 반복에서 변수에 변수 추가)으로 발생할 수있는 복합 부동 소수점 오류를 완화 합니다.
generateSequenceRounded
분수 단계 크기로 인해 부동 소수점 오류가 발생할 수있는 경우 에 대한 방법을 추가했습니다 . 좀 더 산술이 필요하므로 우리와 같은 성능에 민감한 상황에서는 반올림이 필요하지 않은 경우 더 간단한 방법을 사용하는 것이 좋습니다. 대부분의 일반적인 사용 사례에서 반올림 오버 헤드는 무시할 수 있다고 생각합니다.
내가 의도적으로 같은 "비정상"인수를 처리하기위한 논리를 제외 것을 참고 Infinity
, NaN
, start
> end
, 부정적 또는 step
편의를 위해 크기와 손의 문제에 초점을 원한다.
다음은 사용법 및 해당 출력의 예입니다.
System.out.println(DoubleSequenceGenerator.generateSequence(0.0, 2.0, 0.2))
System.out.println(DoubleSequenceGenerator.generateSequenceRounded(0.0, 2.0, 0.2));
System.out.println(DoubleSequenceGenerator.generateSequence(0.0, 102.0, 10.2));
System.out.println(DoubleSequenceGenerator.generateSequenceRounded(0.0, 102.0, 10.2));
[0.0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0, 1.2000000000000002, 1.4000000000000001, 1.6, 1.8, 2.0]
[0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
[0.0, 10.2, 20.4, 30.599999999999998, 40.8, 51.0, 61.199999999999996, 71.39999999999999, 81.6, 91.8, 102.0]
[0.0, 10.2, 20.4, 30.6, 40.8, 51.0, 61.2, 71.4, 81.6, 91.8, 102.0]
이런 종류의 기능을 제공하는 기존 라이브러리가 있습니까?
그렇지 않은 경우 내 접근 방식에 문제가 있습니까?
누구든지 이것에 더 나은 접근 방식을 가지고 있습니까?