【问题标题】:2 digit precision PHP2 位精度 PHP
【发布时间】:2023-03-08 11:03:01
【问题描述】:

我正在尝试在 PHP Laravel 项目中进行 2 位精度,但它不起作用。我有 1234666.6666667 的值,我想创建 1234666.66 但我在这里或/和其他搜索页面中看到的所有结果。 这是我的代码:

$value = 1234666.6666667;
return round($value,2);

还有其他解决方案吗?

【问题讨论】:

  • 做了,没用...
  • @AlonEitan 他希望结果是 1234666.66 而不是 1234666.67
  • 哦,我也应该包括PHP_ROUND_HALF_UP 吗?
  • 我不使用 laravel,但是你试过 sprintf('%.2f') 吗?
  • 是的。我只想删除最后的数字

标签: php


【解决方案1】:

编辑:

正如我所见,您实际上希望将楼数精确到小数点后 2 位,而不是四舍五入,所以 this answer 可以帮助您:

$value = 1234666.6666667;
floor($value * 100) / 100; // returns 1234666.66

如果你想要 3 个小数点,你需要乘以 1000 并除以 4 - 10000 等等。

你可以使用number_format,不过它会将值转换为字符串,所以你会失去真正的浮点值:

$value = 1234666.6666667;
echo number_format($value, 2, '.', ''); // prints 1234666.67

【讨论】:

  • ...虽然这实际上并不是 OP 想要的,但他们想要 1234666.66
  • 似乎没有办法做到这一点(至少很容易,不想为了这么简单的事情而复杂化代码)所以,我会用round来完成
【解决方案2】:

一种务实的方法是使用round($value - 0.05, 2),但即便如此,您也会遇到一些极端情况。浮点数不能很好地四舍五入。这是我害怕的生活。与 1234666.66 最接近的 double

1234666.65999999991618096828460693359375

这就是$value 应用我的公式后的样子!真的,如果你想要精确的十进制精度,那么你需要使用十进制类型。否则使用整数类型并以 100 的倍数工作。

对于前一种选择,请参阅http://de2.php.net/manual/en/ref.bc.php

【讨论】:

    【解决方案3】:
      $value = bcadd($value, 0, 2); // 1234666.6666667 -> 1234666.66
    

    解决此问题的另一种更奇特的方法是使用 bcadd(),$right_operand 的虚拟值为 0, 这将为您提供小数点后的 2 个数字。

    【讨论】:

      【解决方案4】:

      使用此功能。

      function truncate($i) {
          return floor($i*100) / 100.0;
      }
      

      那你就可以了

      $value = truncate(123.5666666); // 123.56
      

      【讨论】:

      • 其实是123.56000000000000227373675443232059478759765625
      • @Bathsheba 周围真的有吗?浮点就是它的本质。
      • 您只需要在向用户显示任何浮点值时注意它。 Excel 做得很好。不过,真的,为了简单的生活,只需使用小数类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多