【发布时间】:2022-10-29 06:49:43
【问题描述】:
我搜索了一个将整数转换为浮点类型的内置函数,但没有。我想将数字 1000 转换为 1000.0
【问题讨论】:
标签: perl
我搜索了一个将整数转换为浮点类型的内置函数,但没有。我想将数字 1000 转换为 1000.0
【问题讨论】:
标签: perl
如果您实际上是在询问如何将浮点数转换为小数细绳用小数表示,那么你可以使用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
【讨论】: