/ / четене и съхраняване на числа в perl без загуба на персионност (Perl) - perl, decimal, научна нотация

четене и съхраняване на числа в perl без загуба на прецизност (Perl) - perl, десетична, научна нотация

Имам няколко номера във файл в различниформати: 8.3, 0.001, 9е-18. Аз търся лесен начин да ги прочета и съхранявам без загуба на точност. Това би било лесно в AWK, но как се прави в Perl? Аз съм отворен само за използване на Perl. Благодаря!

Също така се чудех дали има лесен начин да ги отпечатате в подходящ формат. Например, 8.3 трябва да се отпечата като "8.3", а не с "8.3e0"

Отговори:

4 за отговор № 1

Ако те "текстови низове, а след това ги чете."Perl като низове и записването им като низове не трябва да води до загуба на прецизност. Ако трябва да правите аритметика върху тях, предлагам да инсталирате CPAN модула Math :: BigFloat, за да сте сигурни, че не губите никаква точност закръгляване.

Що се отнася до втория ви въпрос, Perl не прави преформатиране, освен ако не го помолите да:

$ perl -le "print 8.3"
8.3

Изпускам ли нещо?


1 за отговор № 2

от http://perldoc.perl.org/perlnumber.html:

Perl може вътрешно да представлява числа в 3различни начини: като роден числа, като числа с плаваща запетая и като десетични струни. Десетичните низове могат да имат експоненциална част от нота, както е в "12.34e-56". Native тук означава "формат, поддържан от компилатора C. който е бил използван за изграждане на perl ".

Това означава, че отпечатването на числото зависи от това как номерът се съхранява вътрешно в perl, което означава, че на свой ред трябва да знаете как номерът е представен на входа.

Като цяло, Perl просто ще направи правилното нещо, но трябва да знаете какъв компилатор е бил използван, как представя числата вътре и как да отпечатате тези числа. Например:

 $ perldoc -f int

int EXPR

int  Returns the integer portion of EXPR.  If EXPR is omitted, uses $_.  You should
not use this function for rounding: one because it truncates towards 0, and two
because machine representations of floating-point numbers can sometimes produce
counterintuitive results.  For example, "int(-6.725/0.025)" produces -268 rather than
the correct -269; that"s because it"s really more like -268.99999999999994315658
instead.  Usually, the "sprintf", "printf", or the "POSIX::floor" and
"POSIX::ceil" functions will serve you better than will int().

Мисля, че ако искате да четете число изрично като низ, най-добре е да използвате unpack () с формат "A *".