我想得到一个提供一系列小数值的类。
由于浮点数的指定,返回的范围对象没有准确的值。
获得更精确的结果,如python&n; numpy.arange(0.6,0.7,0.01)返回的[0.60,0.61,0.62 ... 0.69]
我的代码如下所示。
// Java range
public class range{
private double start;
private double end;
private double step;
public range(double start,double end, double step) {
this.start = start;
this.end = end;
this.step = step;
}
public List<Double> asList(){
List<Double> ret = new ArrayList<Double>();
for(double i = this.start;i <= this.end; i += this.step){
ret.add(i);
}
return ret;
}
}
你能有任何想法或更聪明的方法来避免这个问题吗?
而且,我希望只使用java标准库来实现。
答案 0 :(得分:0)
在java中只打印0.60
或Float
时,您将无法获得Double
这样的数字。但是,您可以在打印时将这些值格式化为适当的String
值。
所以要么......
asList()
的返回类型更改为List<String>
,并在其中添加您的首选格式。 Double
类List
中Driver
的{{1}}值的显示方式。如果您将方法更改为
,则可以实施第一个选项...
public List<String> asList(){
List<String> ret = new ArrayList<String>();
for(double i = this.start; i <= this.end; i += this.step){
ret.add(String.format("%.2f", i));
}
return ret;
}
....
我在这里使用了String.format()
,但this回答中描述了其他几个选项。
答案 1 :(得分:0)
在此版本中,您可以获得python所具有的(开始,结束,步骤)列表。
class Range实现Iterable {
private int limit;
private double start;
private double end;
private double step;
public Range(int limit) {
this.limit = limit;
}
public Range(double start,double end, double step) {
this.start = start;
this.end = end;
this.step = step;
}
public List<String> asList(){
List<String> ret = new ArrayList<String>();
for(double i = this.start; i <= this.end; i += this.step){
ret.add(String.format("%.2f", i));
}
return ret;
}
@Override
public Iterator<Integer> iterator() {
final int max = limit;
return new Iterator<Integer>() {
private int current = 0;
@Override
public boolean hasNext() {
return current < max;
}
@Override
public Integer next() {
if (hasNext()) {
return current++;
} else {
throw new NoSuchElementException("Range reached the end");
}
}
@Override
public void remove() {
throw new UnsupportedOperationException("Can't remove values from a Range");
}
};
}
}