我有一个关于将$calc
值从科学记数法转换为十进制的问题。
好吗?
my $calc = log2($prob/$probWords);
push @result, join(' ',@words) ." (".$calc.")\n";
if(scalar(@result) == $bloc)
{
$cmp += $bloc;
print "$cmp lignes traités\n";
writeToResultFile($outFile,@result);
@result = ();
}
答案 0 :(得分:9)
您可以使用sprintf将您的号码转换为字符串,并为其提供具体格式。例如:
# Round number to 5 digits after decimal point
$calc_str = sprintf("%.5f", $calc);
答案 1 :(得分:2)
Alois Mahdal在正确的赛道,但很难解决问题。以下是对此事的不同看法。我们可以使用Devel :: Peek来查看Perl在变量中看到的内容。 Perl有三种与C类型相关的基本(非引用)存储类型:字符串是指针(PV),数字可以是浮点数(NV,数值)或整数(IV)。
#!/usr/bin/env perl
use strict;
use warnings;
use Devel::Peek; # Dump
my $x = "1e10";
Dump $x;
输出
SV = PV(0x1204090) at 0x1225b80
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x1212ac0 "1e10"\0
CUR = 4
LEN = 16
PV是一个字符串。你可以看到价值。现在我们强迫一个数字,比如加零。
...
$x += 0;
Dump $x;
产生
SV = PVNV(0xf018f0) at 0xf21b90
REFCNT = 1
FLAGS = (PADMY,IOK,pIOK)
IV = 10000000000
NV = 10000000000
PV = 0xf0eac0 "1e10"\0
CUR = 4
LEN = 16
现在您可以看到该变量同时包含原始PV和代表100亿的数值(NV)(以及整数值(IV))。 IOK告诉我们,它目前被认为是一个整数。它会保留其他值,以防你想再次强迫。
所以你看,从科学值到数字的强制就像从字符串转换为数字一样简单(加零是一种常见的机制)。换句话说,使用sprintf
格式正确。
N.B。为了完整起见,我们可以通过添加小数来看到转换为NV。
...
$x += 0.1;
Dump $x;
输出
SV = PVNV(0x1ee0910) at 0x1f00b90
REFCNT = 1
FLAGS = (PADMY,NOK,pNOK)
IV = 0
NV = 10000000000.1
PV = 0x1eedac0 "1e10"\0
CUR = 4
LEN = 16
和NOK告诉Perl它现在应该是一个浮点值。
答案 2 :(得分:1)
虽然Miguel的答案似乎是你正在寻找的,但我还是会提出一些理论:更正式的答案是:你不能。幸运的是你不需要不管怎样。
Perl不存储带变量的表示法。它甚至不应该是一个字符串或数字:只要任何表示法中的数字存储在字符串中,它就可以用作数字:
$a = "1e4"; # $a now holds "1e4"
print $a . " (read 'one-e-four')\n"; # mentors on pronunciation
$a = $a / 1000; # $a now holds 10
$a = $a . "23"; # $a now holds "1023" (or 1023 or even 1.023e3...)
$a = $a + 1; # $a now holds 1024 (or "1024")
print "Hello " . $a . " worlds\n"; # greets 1024 worlds
转换是隐含的。在上面的例子中:
Perl并不想知道“1e4”在第3行之前是什么意思,当它很快
估计它是一万,因此产生结果十,在我的例子中
分配回$a
。现在存储的值是数字。
现在在下一行的字符串表达式中,10被解释为“10”(十进制 是数值的默认表示法)。这两个字符串的连接 产生字符串“1023”。
与分部相同的故事:“1023”出现在数字表达式中,因此必须 转换为数字
但是,通常情况下,您希望对转换有更多控制权。
如果将[带进来的]字符串转换为[需要用作什么]号码, 一个典型的原因是你不是100%确定字符串形式的样子: 特别是如果它来自用户,回答“输入数字”可以是“100”,但可以 也可以是“0100”,“百”或“你母亲的年龄”(相信我,有些用户可以真的 讨厌)。
这就是regular expressions(或可能是其他技术)的用途。
在另一种情况下,如果要将该值用作字符串的一部分,则可能需要 确定数字的外观 - 使用的符号或字符数。
这就是sprintf and printf的用途。
由于Perl总是准备将任何(数字/字符串)值解释为数字或字符串,
您不需要关心$a
是内部数字还是字符串。在另一
您需要关注的是变量的内容。