Perl转换为int错误但只有特定的数字

PSi*_*cer 4 floating-point perl integer

以下perl代码将浮点数转换为错误的整数

use strict;

my $zahl =297607.22000;
$zahl=$zahl * 100;
print "$zahl\n";
my $text=sprintf ("%017d",$zahl);
print $text;
Run Code Online (Sandbox Code Playgroud)

这个输出是:

29760722
00000000029760721
Run Code Online (Sandbox Code Playgroud)

问题是,您可以将给定的数字更改为其他数字,它可以正常工作.

知道这里有什么问题或者Perl做错了吗?

谢谢你的帮助!

hex*_*der 8

这与FAQ(为什么我得到长小数)有关.$zahl未正确舍入,它向下舍入到下一个较低的整数.

  • `print`将值打印为实数,因此在给定底层表示的精度有限的情况下,它会打印出最准确的值.显然它是通过四舍五入来实现的.当你用`"%d"`'printf`一个实数时,它首先将它从浮点转换为整数,并且该转换会截断.试试`printf"%f%d \n",1.9,1.9`. (2认同)
  • Mat:它本身不是*舍入问题,它是一个表示问题.297607.22不是可表示的浮点数; 它最接近的浮点数将小于或大于它.如果更少,乘以100会得到一个比你预期的整数略小的数字; 如果更多,它会稍微多一些.如果更少,int()/%d会给你一个不同于你预期的数字,如果更多,int()/%d将"工作".但无论哪种情况,int都会向零舍入. (2认同)