Python范围函数,用于Java 8中使用流的Double值

Hos*_*ein 1 java java-8

我想在Java中创建一个双精度数组,其中包含0到100之间的值,步长为0.1

在Python中,可以使用范围函数: range(0, 100, 0.1)

在Java 8中,这可以工作:

Double[] x = DoubleStream.iterate(0.1, i -> i + 0.1).limit(1000).boxed().toArray(Double[]::new);
Run Code Online (Sandbox Code Playgroud)

有什么比我更简单的了吗?

rge*_*man 5

您的解决方案似乎有效,但它会因连续计算而浮点四舍五入.

[0.1,0.2,0.30000000000000004,0.4,0.5,0.6,0.7,0.7999999999999999,0.8999999999999999,0.9999999999999999,1.0999999999999999,

似乎DoubleStream没有range方法,但IntStream确实如此rangeClosed,但是你没有控制增量.(也存在range,但结束参数不包括在范围内.)

通过增量步长1 返回IntStreamstartInclusive(包含)到endInclusive(包含)的顺序.

你可以通过流式传输一些ints然后除以10.0得到你的增量来绕过累积的浮点舍入误差0.1.另外,正如已经评论过的那样,拥有一个原始数组double[]以避免装箱和额外的内存使用更为简单.

double[] y = IntStream.rangeClosed(0, 1000)
    .mapToDouble(i -> i / 10.0)
    .toArray();
Run Code Online (Sandbox Code Playgroud)

[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2,2.3,2.4 ,2.5,

当然总有基本的for循环,对我来说看起来很简单.

double[] z = new double[1001];
for (int i = 0; i < z.length; i++) { z[i] = i / 10.0; }
Run Code Online (Sandbox Code Playgroud)

  • 为了使它更简单:`double [] y = IntStream.rangeClosed(0,1000).mapToDouble(i - > i/10d).toArray();`---除非OP特别需要`Double []`,与使用`double []`相比,它也浪费了内存. (2认同)