#!/usr/bin/perl use strict; use warnings; my $signifikant=3; my $z="10.000000128536"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="10.000001117885000001100000"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="0.000000195675"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="0.1000000195675"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.1399999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.00099999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.00090000019999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.99999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1099.99999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="9999.9999999"; print "$z --> ".round_significant($z,$signifikant)."\n"; ########################################################## ########################################################## sub round_significant { my $zahl=shift; my $stelle=shift; if(my ($zv,$zn) = $zahl =~/^([\d\.]+0)([1-9]{$stelle})\d*?$/) { $zv.="0"x$stelle; $zn++; my $l=length($zn); substr($zv,-1*$l,$l,$zn); $stelle--; $zv=~s/(\.\d{$stelle,}[1-9]+)0+$/$1/; $zahl=$zv; } else { $zahl= sprintf("%.${stelle}f",$zahl); } return $zahl; }