في بيرل، كيف يمكنني الحد من عدد الأماكن بعد النقطة العشرية ولكن ليس لها أصفاء زائدة؟

StackOverflow https://stackoverflow.com/questions/571329

  •  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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top