gpt4 book ai didi

php - round() 除了对数字进行四舍五入还有什么作用?

转载 作者:可可西里 更新时间:2023-10-31 22:45:47 24 4
gpt4 key购买 nike

我刚刚“修复”了以下 PHP 行中的错误:

        $value = 1091.09; // the failing test case
$prop = sprintf('%013d', $value * 100);

通过添加这些行:

        $cents = $value * 100; // $cents is now 109109
$cents = round($cents, 2); // $cents is still 109109
$prop = sprintf('%013d', $cents);

前一个 block 的结果是"0000000109108",而第二个 block 的结果是"0000000109109",这是正确的。

请注意,我添加了这两行以便能够分别查看调试器中的每个步骤。如果我跳过第一行,它也可以工作,因此写:

        $cents = round($value * 100, 2); // $cents is now 109109
$prop = sprintf('%013d', $cents);

显然,round() 函数做了一些对值不可见的事情,这使得它与 sprintf() 的工作方式不同。这是什么?

如果这是一种合适的语言,我可能会通过查看数据类型知道。在这里,我什至不知道它们是什么。

最佳答案

重点:

初始数据类型为 float64。

乘以 100 后它仍然是一个 float 。

打印(使用 echo/print_r/var_dump)该值不打印绝对精确值 (109108.9999999999999);它打印近似的浮点值 109109 因为 float 本质上是近似值而不是精确值。

使用 sprintf 将其打印为 int 会触发类型转换为 int,将 109108.9999999999999 的值截断为 109108

因此您的问题。


作为旁注:

PHP 支持的基本类型是使用处理程序变量和引用计数容器构造的。除此之外,它们几乎都是低级的东西。

没有理由认为它们比看起来“更复杂”。我开始考虑一个复杂的对象,而不是一个标量数据类型。

还有一个很大的混淆因素是(隐式)类型转换和所有类型转换规则(包括可以作为 bool 值 false 传递的所有内容)。

示例 1:

  -1 == false // true
null == false // true
-1 != null // false

例 2:

0  == false // true
0 === false // false

关于php - round() 除了对数字进行四舍五入还有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12040939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com