Как мне установить точность с плавающей запятой в Perl?

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

Вопрос

Есть ли способ установить точность 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;  
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top