В Perl 6 есть тип данных Num, который является типом с плавающей точкой. В отличие от многих языков, Perl 6 по возможности избегает этого типа в пользу типа Rat.
Создать объект типа Num можно либо явно вызвав конструктор, либо с помощью научной записи:
my $n = Num.new(42); say $n.WHAT; # (Num) my $m = 4.2E2; say $m.WHAT; # (Num)
Встроенные константы типа числа пи — тоже имеют тип Num:
say pi.WHAT; # (Num) say e.WHAT; # (Num) say Inf.WHAT; # (Num)
Тип результата арифметических операций зависит от типов операндов. Например, если в вычислениях участвуют только рациональные числа, результат будет рациональным. Если же встретится число с плавающей точкой, получится Num:
say (0.1 + 0.2).WHAT; # (Rat) say (1e-1 + 2e-1).WHAT; # (Num) say (0.1 + 1E-1).WHAT; # (Num)
При вычислениях с величинами, которые не могут быть точно представлены в виде 64-битового числа с плавающей точкой, нужно проявлять осторожность. Например, вчера в Твиттере обсуждался такой пример:
say 5.5e22 % 100; # 0
Понятно, что правильный ответ должен быть 0. И действительно, Perl 6 печатает 0.
Однако, если преобразовать это число к целому числу (Int), то проявится ошибка представления:
say 5.5e22.Int; # 55000000000000002097152
Еще более опасно пытаться проделать деление по модулю с близкими числами, которые уже не должны давать ноль, если считать без округления:
say (5.5e22 + 1) % 100; # 0?!
А печатается ноль.