【问题标题】:How can I convert an integer to a float value in Perl?如何在 Perl 中将整数转换为浮点值?
【发布时间】:2022-10-29 06:49:43
【问题描述】:

我搜索了一个将整数转换为浮点类型的内置函数,但没有。我想将数字 1000 转换为 1000.0

【问题讨论】:

    标签: perl


    【解决方案1】:

    对于实际数学,无需转换数字。 Perl 不区分整数和浮点数(它实际上在幕后进行,但这无关紧要)。

    如果要输出带小数的数字,可以分别使用sprintfprintf

    %f 转换是您想要的。您可以告诉它在逗号后有小数。

    printf '%.1f', 1000; # will print 1000.0
    

    这将尊重您的语言环境并使用正确的逗号符号。

    【讨论】:

      【解决方案2】:

      如果您实际上是在询问如何将浮点数转换为小数细绳用小数表示,那么你可以使用printf/sprintf

      例如,以下打印$x 有一位小数,无论它是存储为整数还是浮点数。

      my $x = 1000;
      printf "%.1f", $x;   # 1000.0
      

      但是,如果您确实想按照您的要求转换为浮点数,则没有内置函数可以执行此操作。

      Perl 会在需要时自动将标量转换为浮点数(例如,将整数乘以0.1 时),所以通常不需要这个。事实上,没有内置机制可以做到这一点。

      虽然1.0 创建了一个浮点数(NOK),但您甚至无法通过乘以1.0(使用* 0.1*= 0.1)得到一个浮点数。

      $ perl -MDevel::Peek -e'
         my $x = 1000;      Dump( $x );
         my $y = 1.0;       Dump( $y );
         my $z = $x * $y;   Dump( $z );
      '
      SV = IV(0x55efe5c37e58) at 0x55efe5c37e68
        REFCNT = 1
        FLAGS = (IOK,pIOK)      <-- Signed integer
        IV = 1000
      SV = NV(0x55efe5c37e98) at 0x55efe5c37eb0
        REFCNT = 1
        FLAGS = (NOK,pNOK)      <-- Floating point number
        NV = 1
      SV = IV(0x55efe5c37ff0) at 0x55efe5c38000
        REFCNT = 1
        FLAGS = (IOK,pIOK)      <-- Signed integer
        IV = 1000
      

      这根本不是你应该想做的事情。

      问题是某些接口赋予了数字存储方式的含义。例如,JSON 序列化程序可能对存储为整数的数字进行序列化,而不是对存储为浮点数的数字进行序列化。这可以被认为是一个错误。

      错误与否,它不会改变您需要请求转换的事实。它可以使用 Perl API 来完成。

      use Inline C => <<'__EOS__';
      
         SV* SvNV_force( SV* sv ) {
            SvREFCNT_inc( sv );
            sv_setnv( sv, SvNV( sv ) );
            return sv;
         }
      
      __EOS__
      
      use Devel::Peek qw( Dump );
      
      my $x = 1000;       Dump( $x );
      SvNV_force( $x );   Dump( $x );
      
      SV = IV(0x55a354e92508) at 0x55a354e92518
        REFCNT = 1
        FLAGS = (IOK,pIOK)      <-- Signed integer
        IV = 1000
      SV = PVNV(0x55a354e611a0) at 0x55a354e92518
        REFCNT = 1
        FLAGS = (NOK,pNOK)      <-- Floating point number
        IV = 1000
        NV = 1000
        PV = 0
      

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 2014-04-28
        • 1970-01-01
        • 2013-08-23
        • 2011-05-21
        • 2010-10-10
        • 2012-10-07
        相关资源
        最近更新 更多