比方说,我有一个Perl的变量:在Perl中获取float的精度?
my $string = "40.23";
my $convert_to_num = $string * 1;
有没有一种方法,我可以找到这个浮点值的精确度?我的解决方案到目前为止只是简单地遍历字符串,找到'。'的第一个实例,并开始计算多少位小数,在这种情况下返回2。我只是想知道这种事情是否有更优雅或内置的功能。谢谢!
比方说,我有一个Perl的变量:在Perl中获取float的精度?
my $string = "40.23";
my $convert_to_num = $string * 1;
有没有一种方法,我可以找到这个浮点值的精确度?我的解决方案到目前为止只是简单地遍历字符串,找到'。'的第一个实例,并开始计算多少位小数,在这种情况下返回2。我只是想知道这种事情是否有更优雅或内置的功能。谢谢!
这里是 “期之后的事情号” 的答案在$ nstring
length(($nstring =~ /\.(.*)/)[0]);
匹配的部分首先发现。 (\。),然后匹配其他所有内容(。*)。由于。*在括号中,因此返回为第一个数组元素([0])。然后我用length()函数来计算多少。
感谢您的帮助,这正是我一直在寻找的! – lordmarinara 2012-07-05 22:30:15
您在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
问题是我无法设置它。我从Excel电子表格中的单元格中读取数据,只想读取电子表格中的内容,而不是设置自己的全局限制。 – lordmarinara 2012-07-05 18:39:10
是什么让你无法读取你的电子表格值并将它们内部存储为大浮点数?我认为这取决于程序员如何处理他从外部收到的数据。 – DavidO 2012-07-05 18:44:01
对,我同意,我正在那样做。但我还需要存储的字段之一是有多少个小数位。 – lordmarinara 2012-07-05 18:53:44
沿着这条道路就是疯狂。除少数特殊情况外,为数字的浮点表示赋予小数精度是徒劳的。执行此代码并重新考虑您的问题:'perl -e'printf“%。* f \ n”,$ _,“40.23”for 14,15,41'' – mob 2012-07-05 18:28:21
我无法无误地运行该代码? – lordmarinara 2012-07-05 18:43:49
当我读到这个问题时,问题不是从存储为float或BigFloat的值计算小数位数,而是计算输入数字中小数点后面出现的数字数。也就是说,一个字符串已被读取,问题是字符串处理问题,而不是数值计算。那是对的吗? – 2012-07-05 18:58:55