神勇威武的长颈鹿 · 如何在Perl中将整数转换为浮点值?-腾讯云 ...· 昨天 · |
奋斗的乒乓球 · windows bat ...· 1 月前 · |
独立的奔马 · VSCode:在调试控制台中显示整个变量-腾 ...· 2 月前 · |
文质彬彬的野马 · The mixin pattern in ...· 3 月前 · |
发呆的猴子 · 好看的历史小说排行榜_排名前十的外国历史小说 ...· 4 月前 · |
安静的人字拖 · 著名古文字学家李铁华教授来校主讲“五千年文明 ...· 4 月前 · |
我搜索内置函数将整数转换为浮动类型,但是没有。我想把一个数字1000转换成1000.0。
发布于 2022-10-26 13:57:52
发布于 2022-10-26 14:09:47
如果您实际上是在询问如何将浮点数转换为带有小数位的十进制字符串表示形式,那么您可以使用
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来完成。
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