Java中的小数范围类

时间:2017-03-24 05:34:31

标签: java range decimal

我想得到一个提供一系列小数值的类。

由于浮点数的指定,返回的范围对象没有准确的值。

获得更精确的结果,如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标准库来实现。

2 个答案:

答案 0 :(得分:0)

在java中只打印0.60Float时,您将无法获得Double这样的数字。但是,您可以在打印时将这些值格式化为适当的String值。

所以要么......

  1. 您可以将asList()的返回类型更改为List<String>,并在其中添加您的首选格式。
  2. 或者您可以更改DoubleListDriver的{​​{1}}值的显示方式。
  3. 如果您将方法更改为

    ,则可以实施第一个选项
    ...
    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");
        }
    };
}

}