【问题标题】:PHP wrong round precisionPHP错误的舍入精度
【发布时间】:2021-03-16 14:52:08
【问题描述】:

嗨!

我一直在尝试用 PHP 对数字进行四舍五入,但出现了精度错误。

$test = 53.974999994;
echo round($test, 2);

我想要的结果是 53.98。

但是这段代码给了我 53.97。

谁能告诉我为什么?

谢谢!

【问题讨论】:

  • 您能否详细说明您认为结果错误的原因?
  • 这个四舍五入的数字表应该有助于解释 - factmonster.com/math-science/mathematics/…
  • 是的,它被忽略了,因为这就是数学的运作方式。 53.974999994 小于 53.975,因此向下舍入。
  • 不,您只检查下一个有效数字(因此,如果四舍五入到两位,则查看第三位)。因此,在这种四舍五入的情况下(默认算法),这是预期的结果。
  • 我认为您必须考虑将 Pi 舍入到 12 位可能的计算要求。如果您在进行四舍五入时考虑到所有数以亿计的小数位,那么您肯定能够将前往 Alpha Centori 的快速旅行纳入所需的时间:)

标签: php decimal rounding


【解决方案1】:

我猜代码运行良好,但您要查找的结果不同,如果要将数字四舍五入到百分之一,则必须取数字的第三位小数,例如:53.974

因此,新数字将是 53.97,因为小数点后第三位不允许您将数字近似为 53.98
take a look

如果您想执行以下操作: 小数 n 近似于小数 n-1 等等。

你可以试试这样的

`

$test = 53.974999994;

function round_with_n_decimals($number, $decimals, $decimals_to_count){
    while($decimals_to_count >= $decimals){
        $number = round($number, $decimals_to_count);
        $decimals_to_count--;
    }
    return $number;
}

echo round_with_n_decimals($test, 2, 3);

`

【讨论】:

  • 好的,我明白了这里的问题,但是php的舍入方法是不是有点坏了?因为你的函数应该是用小数取整的基本过程。
【解决方案2】:

你可以试试这个:

$test = 53.974999994;
echo round(round($test, 3), 2);

解释:

根据提问者的说法,实际上重要的是点后的前两位数,在这种情况下,先将其四舍五入,就好像它是 3 位数字,然后将其降至 2 位数字,所需的是达到了。

round($test, 3) 等于53.985round(53.985, 2) 将给出53.99

【讨论】:

  • 我试过这个,它似乎工作,你能解释一下怎么做吗?它与每个数字都兼容吗?
  • 得到 OP 认为他们想要的结果,但这不一定是正确的答案
  • @RiggsFolly 没错,如果我使用 53.94449999994 并将您的方法四舍五入为 3,我会得到 53.94,这是错误的,因为我想得到 53.95。
  • @AntoineJoublin 如果你能抽出时间en.wikipedia.org/wiki/Rounding
猜你喜欢
  • 2013-07-22
  • 2019-09-22
  • 2015-11-26
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多