【问题标题】:Getting precision of a float in Perl?在 Perl 中获得浮点数的精度?
【发布时间】:2012-07-05 18:05:43
【问题描述】:

假设我有一个 Perl 变量:

my $string = "40.23";

my $convert_to_num = $string * 1;

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

【问题讨论】:

  • 沿着这条路走下去就是疯狂。为数字的浮点表示分配小数精度是徒劳的,除非在少数特殊情况下。执行此代码并重新考虑您的问题:perl -e 'printf "%.*f\n", $_, "40.23" for 14,15,41'
  • 我无法正常运行该代码?
  • 当我阅读问题时,问题不是从存储为浮点数或 BigFloat 的值计算小数位数,而是计算输入中小数点后出现的位数数字。也就是读取了一个字符串,问题是字符串处理的问题,不是数值计算的问题。对吗?
  • 就是这样。我只是想知道是否有内置函数或标准解决方案来返回数字和/或字符串中的小数位数。经过研究和上面提出的解决方案后,我找不到任何东西。
  • 精度与小数位数有什么关系?

标签: string perl floating-point decimal


【解决方案1】:

这是 $nstring 中“期间后的事物数量”的答案

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

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

【讨论】:

  • 感谢您的帮助,这正是我想要的!
【解决方案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";

会回来

52.1200000000 的精度为 12 长度 4

【讨论】:

  • 问题是我不能设置。我正在读取 Excel 电子表格中的单元格,只想读取电子表格中的内容,而不是设置我自己的全局限制。
  • 是什么阻止您读取电子表格值并将它们作为大浮点数在内部存储?我认为这取决于程序员如何处理他从外部来源收到的数据。
  • 好吧,我同意,我正在这样做。但我还需要存储的字段之一是有多少位小数。
  • length() 运算符告诉您有多少个数字。 (在这种情况下,4)
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 2010-12-22
  • 1970-01-01
  • 2011-09-14
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
相关资源
最近更新 更多