2009-12-03 4 views
13

Есть ли способ установить точность с плавающей запятой Perl (до 3 цифр), не изменяя ее специально для каждой переменной?Как установить точность с плавающей запятой в Perl?

Нечто похожее на Tcl:

global tcl_precision 
set tcl_precision 3 
+0

Вы хотите только три цифры, или три цифры после запятой? Есть разница :) –

+0

есть ли способ сделать любой из них? –

ответ

12

Там нет никакого способа, чтобы глобально изменить это.

Если это только для целей отображения, используйте sprintf("%.3f", $value);.

Для математических целей используйте (int(($value * 1000.0) + 0.5)/1000.0). Это будет работать для положительных чисел. Однако вам нужно будет изменить его для работы с отрицательными числами.

+1

Если это просто для показа, то установите '$ # = '%. 3f'' - см.' Perldoc perlvar' – mob

+0

'$ #' удален в Perl 5.10 :( – skaurus

+1

@ SinanÜnür no, вы не можете! Пример: 'perl -E '$ _ = 155, скажем, sprintf ("%. 2f", $ _/1000); '' Должен печатать '0.16', но печатает' 0.15' (см. Http://stackoverflow.com/q/24493228/734304) – kobame

19

Использование Math::BigFloat или bignum:

use Math::BigFloat; 
Math::BigFloat->precision(-3); 

my $x = Math::BigFloat->new(1.123566); 
my $y = Math::BigFloat->new(3.333333); 

Или с bignum вместо делать:

use bignum (p => -3); 
my $x = 1.123566; 
my $y = 3.333333; 

Тогда в обоих случаях:

say $x;  # => 1.124 
say $y;  # => 3.333 
say $x + $y; # => 4.457 
2

Я бы не рекомендовал использовать Sprintf («% .3f», значение $).

Пожалуйста, посмотрите на следующий пример: (6,02 * 1,25 = 7,525)

printf("%.2f", 6.02 * 1.25) = 7.52

printf("%.2f", 7.525) = 7.53

1

Лечить результат в виде строки и использовать substr. Например:

$result = substr($result,0,3); 

Если вы хотите сделать округление, сделайте это как строку тоже. Просто получите следующего персонажа и решите.

0

Или вы можете использовать следующий укоротить все, что приходит после третьего знака после запятой:

if ($val =~ m/([-]?[\d]*\.[\d]{3})/) { 
    $val = $1; 
} 
Смежные вопросы