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