Round the string
Perl, 22 20 bytes
printf"%.*f",pop,pop
Using:
perl -e 'printf"%.*f",pop,pop' 123456789.987654321 3
It is Dada’s version of code. Previous:
printf"%*2\$.*f",@ARGV
PHP, 33 31 bytes
PHP rounds correctly too (at least on 64 bit):
printf("%.$argv[2]f",$argv[1]);
takes input from command line arguments. Run with -r
.
PHP, no built-ins, 133 bytes
[,$n,$r]=$argv;if($p=strpos(_.$n,46))for($d=$n[$p+=$r],$n=substr($n,0,$p-!$r);$d>4;$n[$p]=(5+$d=$n[$p]-4)%10)$p-=$n[--$p]<"/";echo$n;
Run with -nr
or test it online.
breakdown
[,$n,$r]=$argv; // import arguments
if($p=strpos(_.$n,46)) // if number contains dot
for($d=$n[$p+=$r], // 1. $d= ($r+1)-th decimal
$n=substr($n,0,$p-!$r); // 2. cut everything behind $r-th decimal
$d>4; // 3. loop while previous decimal needs increment
$n[$p]=(5+$d=$n[$p]-4)%10 // B. $d=current digit-4, increment current digit
)
$p-=$n[--$p]<"/"; // A. move cursor left, skip dot
echo$n;
A null byte doesn´t work; so I have to use substr
.
Python, 114 105 103 96 91 89 bytes
Saved 5 bytes thanks to Kevin Cruijssen
Saved 2 bytes thanks to Krazor
from decimal import*
d=Decimal
lambda x,y:d(x).quantize(d('0.'[y>0]+'1'*y),ROUND_HALF_UP)
Try it online!