我写了一个简单的代码:
sub euler-ex ($x) of Seq {
1, { $x**++$ / [×] 1 .. ++$ } ... Inf }
say " 5: " ~ euler-ex(5)[^20] ~ " = " ~ [+](euler-ex(5)[^20]);
输出:
5: 1 5 12.5 20.833333 26.041667 26.041667 21.701389 15.500992 9.68812 5.382289 2.6911445 1.22324748 0.50968645 0.19603325 0.07001187499 0.023337291662 0.0072929036444 0.00214497166011 0.000595825461143 0.000156796173985 = 148.41310786833832
如何指定输出的位数,即序列显式生成器中的小数位数?
您可以将最后一行更改为
say " 5: " ~ euler-ex(5)[^20].fmt("%0.10f") ~ "=" ~ [+](euler-ex(5)[^20]).fmt("%0.10f");
并获得类似的输出
5: 1.0000000000 5.0000000000 12.5000000000 20.8333333333 26.0416666667 26.0416666667 21.7013888889 15.5009920635 9.6881200397 5.3822889109 2.6911444555 1.2232474798 0.5096864499 0.1960332500 0.0700118750 0.0233372917 0.0072929036 0.0021449717 0.0005958255 0.0001567962=148.4131078683
您可能有兴趣知道这个序列正在生成Rat
s,因此如果您愿意,可以获得确切的值。你可以看到";生的";值
dd euler-ex(5)[^20];
(1, 5.0, 12.5, <125/6>, <625/24>, <625/24>, <3125/144>, <15625/1008>, <78125/8064>, <390625/72576>, <390625/145152>, <1953125/1596672>, <9765625/19160064>, <48828125/249080832>, <244140625/3487131648>, <244140625/10461394944>, <1220703125/167382319104>, <6103515625/2845499424768>, <30517578125/51218989645824>, <152587890625/973160803270656>)
您可以round
一个所需比例的数字:
>>> 12.8471 .round(0.01)
12.85
12.8471四舍五入到0.01的最接近倍数;有效地,小数点后2位。
你有一个数字序列,所以map
就在那里:
>>> (1, * + 𝑒 ... *) .head(5)
(1 3.718281828459045 6.43656365691809 9.154845485377136 11.87312731383618)
>>> (1, * + 𝑒 ... *) .map(*.round(0.01)) .head(5)
(1 3.72 6.44 9.15 11.87)
因此,例如,对于2个小数点,需要0.01==10**-2;那么我们可以将其论证为函数:
sub euler-ex($x, Int :$digits) of Seq {
my $seq := 1, { $x ** ++$ / [×] 1 .. ++$ } ... Inf;
$digits
?? $seq.map(*.round(10 ** -$digits))
!! $seq
}
>>> euler-ex(5).head(6)
(1 5 12.5 20.833333 26.041667 26.041667)
>>> euler-ex(5, :3digits).head(6)
(1 5 12.5 20.833 26.042 26.042)
如果提供了$digits
(并且非零…(,则序列将返回,其计算值四舍五入到小数点后的许多位。否则,按原样。
注意,round
会返回一个数值(例如,上面的Rational(,而12.3. round(0.01)
会给出12.3
而不是12.30
,即不放入尾随零。如果需要,.fmt
作为另一个答案(但在map
;或sprintf
中(是可能的(注意它们给出字符串(。