我想在Java中创建一个double数组,其值范围从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);
我可以使用更简单的方法吗?
答案 0 :(得分: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
does, rangeClosed
却没有控制增量。 (也存在range
,但结束参数不包含在范围内。)
以1的增量步长将
IntStream
(包括)到startInclusive
(包括)的有序endInclusive
返回。
您可以通过流传输一些int
然后除以10.0
来获得0.1
的增量来解决累积浮点舍入误差。另外,正如已经提到的,具有原始数组double[]
可以避免装箱和额外的内存使用。
double[] y = IntStream.rangeClosed(0, 1000)
.mapToDouble(i -> i / 10.0)
.toArray();
[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; }
答案 1 :(得分:0)
当您说“我可以使用更简单的方法吗?”在这种情况下,我认为“简单”意味着“较短”的代码。
使用流API,没有任何东西可以使您的当前代码“更短”。可能解释了为什么Java不是打高尔夫球的顶级代码之一。但是它可以完成工作。
我可能要说的很明显,但是您始终可以做的一件事就是将当前逻辑重构/隐藏到辅助方法range(p1, p2, p3)
中,如果您不想这样做,就不必再看一遍并且仅可以调用range(...)
。
另一方面,@rgettman在“浮点舍入”方面大喊大叫,因此请考虑到这一点。