2012-07-05 105 views
1

比方说,我有一个Perl的变量:在Perl中获取float的精度?

my $string = "40.23";

my $convert_to_num = $string * 1;

有没有一种方法,我可以找到这个浮点值的精确度?我的解决方案到目前为止只是简单地遍历字符串,找到'。'的第一个实例,并开始计算多少位小数,在这种情况下返回2。我只是想知道这种事情是否有更优雅或内置的功能。谢谢!

+4

沿着这条道路就是疯狂。除少数特殊情况外,为数字的浮点表示赋予小数精度是徒劳的。执行此代码并重新考虑您的问题:'perl -e'printf“%。* f \ n”,$ _,“40.23”for 14,15,41'' – mob 2012-07-05 18:28:21

+0

我无法无误地运行该代码? – lordmarinara 2012-07-05 18:43:49

+0

当我读到这个问题时,问题不是从存储为float或BigFloat的值计算小数位数,而是计算输入数字中小数点后面出现的数字数。也就是说,一个字符串已被读取,问题是字符串处理问题,而不是数值计算。那是对的吗? – 2012-07-05 18:58:55

回答

2

这里是 “期之后的事情号” 的答案在$ nstring

length(($nstring =~ /\.(.*)/)[0]); 

匹配的部分首先发现。 (\。),然后匹配其他所有内容(。*)。由于。*在括号中,因此返回为第一个数组元素([0])。然后我用length()函数来计算多少。

+0

感谢您的帮助,这正是我一直在寻找的! – lordmarinara 2012-07-05 22:30:15

2

您在Perl中使用普通变量所做的任何操作都将取决于您使用的编译器和硬件。如果您真的在意精度,请使用

use "Math::BigFloat"; 

并设置所需的属性。在Math :: BigFloat中,数字的数量更准确地称为精度。

use Math::BigFloat; 

Math::BigFloat->accuracy(12); 
$n = new Math::BigFloat "52.12"; 

print "Accuracy of $n is ", $n->accuracy(), " length ",scalar($n->length()),"\n"; 

将返回

 
Accuracy of 52.1200000000 is 12 length 4 
+0

问题是我无法设置它。我从Excel电子表格中的单元格中读取数据,只想读取电子表格中的内容,而不是设置自己的全局限制。 – lordmarinara 2012-07-05 18:39:10

+0

是什么让你无法读取你的电子表格值并将它们内部存储为大浮点数?我认为这取决于程序员如何处理他从外部收到的数据。 – DavidO 2012-07-05 18:44:01

+0

对,我同意,我正在那样做。但我还需要存储的字段之一是有多少个小数位。 – lordmarinara 2012-07-05 18:53:44

相关问题