في بيرل، كيف يمكنني الحد من عدد الأماكن بعد النقطة العشرية ولكن ليس لها أصفاء زائدة؟
-
05-09-2019 - |
سؤال
هذا السؤال يشبه "إسقاط زائدة" .0 "من العلاوات", ولكن بالنسبة إلى بيرل ومع عدد الأرقام القصوى بعد العشرية.
أبحث عن طريقة لتحويل الأرقام إلى تنسيق السلسلة، وإسقاط أي زائدة عن الحاجة "0"، بما في ذلك ليس فقط بعد العشرية. وما زلت بحد أقصى عدد الرقمية، على سبيل المثال 3
بيانات الإدخال يطفو. النتيجة المرجوة:
0 -> 0
0.1 -> 0.1
0.11 -> 0.11
0.111 -> 0.111
0.1111111 -> 0.111
المحلول
تستطيع ايضا استخذام الرياضيات :: جولة لفعل هذا:
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.1), "\n"'
0.1
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.11111), "\n"'
0.111
نصائح أخرى
استخدم ما يلي:
my $s = sprintf('%.3f', $f);
$s =~ s/\.?0*$//;
print $s
... أو تحديد الروتين الفرعي للقيام بذلك بشكل عام:
sub fstr {
my ($value,$precision) = @_;
$precision ||= 3;
my $s = sprintf("%.${precision}f", $value);
$s =~ s/\.?0*$//;
$s
}
print fstr(0) . "\n";
print fstr(1) . "\n";
print fstr(1.1) . "\n";
print fstr(1.12) . "\n";
print fstr(1.123) . "\n";
print fstr(1.12345) . "\n";
print fstr(1.12345, 2) . "\n";
print fstr(1.12345, 10) . "\n";
مطبوعات:
0
1
1.1
1.12
1.123
1.123
1.12
1.12345
يمكنك استخدام "Sprinth" جنبا إلى جنب مع "eval".
my $num = eval sprintf('%.3f', $raw_num);
علي سبيل المثال:
#!/usr/bin/perl
my @num_array = (
0, 1, 1.0, 0.1, 0.10, 0.11, 0.111, 0.1110, 0.1111111
);
for my $raw_num (@num_array) {
my $num = eval sprintf('%.3f', $raw_num);
print $num . "\n";
}
المخرجات:
0
1
1
0.1
0.1
0.11
0.111
0.111
0.111
هذا سوف يمنحك الإخراج الخاص بك،
sub dropTraillingZeros{
$_ = shift;
s/(\d*\.\d{3})(.*)/$1/;
s/(\d*\.\d)(00)/$1/;
s/(\d*\.\d{2})(0)/$1/;
print "$_\n";
}
dropTraillingZeros(0);
dropTraillingZeros(0.1);
dropTraillingZeros(0.11);
dropTraillingZeros(0.111);
dropTraillingZeros(0.11111111);
لا تنتمي إلى StackOverflow