Getting precision of a float in Perl?
假设我有一个Perl变量:
my $string ="40.23";
my $convert_to_num = $string * 1;
有没有一种方法可以找到此float值的精度?到目前为止,我的解决方案是简单地循环遍历字符串,找到"。"的第一个实例,然后开始计算多少个小数位,在这种情况下返回2。我只是想知道对于这种事情是否有更优雅或内置的功能。谢谢!
- 疯狂就在这条路上。除非在某些特殊情况下,否则将十进制精度分配给数字的浮点表示是徒劳的。执行此代码并重新考虑您的问题:perl -e 'printf"%.*f\
", $_,"40.23" for 14,15,41'
-
我无法正确运行该代码?
-
当我读到问题时,问题不在于从存储为浮点数或BigFloat的值中计算小数位数,而是计算输入数字中小数点后出现多少位数。也就是说,已读取字符串,而问题是字符串处理问题,而不是数值计算问题。那是对的吗?
-
就是这样。我只是想知道是否有内置函数或标准解决方案来返回数字和/或字符串中的小数位数。经过上面的研究和提出的解决方案,我什么也找不到。
-
精度与小数位数有什么关系?
-
40.23的精度是4,不是吗?
-
我的错误,我混淆了我的定义。我的意思是小数位数,而不是精度。
-
不,在有限精度机器上40.23的浮点表示的精度不是4。
这里是$ nstring
中"期后事物数"的答案
1
| length(($nstring =~ /\\.(.*)/)[0]); |
匹配部分首先找到。 (\\\\。),然后匹配其他所有内容(。*)。由于。*放在括号中,因此它作为第一个数组元素([0])返回。然后我用length()函数计算出多少个。
在Perl中使用纯变量执行的任何操作都将取决于您使用的编译器和硬件。如果您真的很在意精度,请使用
并设置所需的属性。在Math :: BigFloat中,位数更恰当地称为"准确性"。
1 2 3 4 5 6 7
| use Math ::BigFloat;
Math ::BigFloat->accuracy(12);
$n = new Math ::BigFloat"52.12";
print"Accuracy of $n is", $n->accuracy()," length",scalar($n->length()),"\
"; |
将返回
1
| Accuracy of 52.1200000000 is 12 length 4 |
- 问题是我无法设置它。我正在读取Excel电子表格中的单元格,只想读取电子表格中的内容,而不是设置自己的全局限制。
-
是什么导致您无法读取电子表格值并将其作为内部浮动对象存储在内部?我认为这取决于程序员如何处理他从外部来源接收的数据。
-
是的,我同意,我正在这样做。但是我还需要存储的字段之一是有多少个小数位。
-
length()运算符告诉您有多少个数字。 (在这种情况下,为4)