Как установить точность с плавающей запятой в Perl?
Есть ли способ установить Perl script точность с плавающей запятой (до 3 цифр), не меняя ее специально для каждой переменной?
Нечто похожее на TCL:
global tcl_precision
set tcl_precision 3
Ответы
Ответ 1
Невозможно глобально изменить это.
Если это просто для целей отображения, используйте sprintf("%.3f", $value);
.
В математических целях используйте (int(($value * 1000.0) + 0.5) / 1000.0)
. Это будет работать для положительных чисел. Вам нужно будет изменить его, чтобы работать с отрицательными номерами.
Ответ 2
Используйте 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
Ответ 3
Я бы не рекомендовал использовать sprintf ( "%. 3f", $value).
Пожалуйста, посмотрите следующий пример:
(6,02 * 1,25 = 7,525)
printf("%.2f", 6.02 * 1.25) = 7.52
printf("%.2f", 7.525) = 7.53
Ответ 4
Обработать результат как строку и использовать substr
. Вот так:
$result = substr($result,0,3);
Если вы хотите сделать округление, сделайте это как строку. Просто получите следующий символ и решите.
Ответ 5
Или вы можете использовать следующее, чтобы усечь все, что приходит после третьей цифры после десятичной точки:
if ($val =~ m/([-]?[\d]*\.[\d]{3})/) {
$val = $1;
}