【问题标题】:PHP: Does BCMath accept integers?PHP:BCMath 是否接受整数?
【发布时间】:2018-08-22 00:23:05
【问题描述】:

在 PHP 的 BCMath 函数中使用 INT 类型变量是否安全?

例子:

<?php
$a = 1;
$b = "1";
echo bcadd($a,$b,0);
?>

这似乎可行,但这样做安全吗?或者是否存在例如 PHP 可以将 INT 解释为 int 值以外的其他东西的风险(我正在考虑十六进制值等)?

谢谢!

【问题讨论】:

  • 您的主题行与您的实际问题不符...
  • 如果你愿意,你可以像这样转换你的变量:bcadd((int) $a, (int) $b, 0);
  • Rod Elias:我知道,但我的问题是在传递 INT(通过 INT var 或通过强制转换非 INT var)而不是 STRINGS 时是否保证正确的结果。
  • bc 函数接受 string 参数并返回 strings。
  • 如果您将一个有效的 PHP 整数(或浮点数)传递给 bcadd,它的工作方式与您首先将变量转换为字符串一样。它以与任何 PHP 函数相同的方式“接受”它们——它们只是使用内置的类型转换逻辑透明地转换。

标签: php bcmath


【解决方案1】:

小心处理非常大的数字。如果将文字整数 > PHP_INT_MAX 分配给变量 PHP will automatically convert it to a float。我知道您特别询问了整数,在这种情况下您将传递一个浮点数,但如果您不知道自动转换它看起来像,那么您正在使用一个大整数,所以我觉得值得一提。

$a = 9223372036854775808;
$b = '1';

var_dump($b);              // float 9.2233720368548E+18
echo bcadd($a, $b, 0);     // echoes 1

基本上,该函数确实需要一个字符串。如果你给它的不是字符串,PHP 会自动将它转换为字符串,除非你启用了strict mode。

【讨论】:

  • 非常感谢!对于巨大的数字(> PHP_INT_MAX)我确实使用字符串,我的实际问题是我是否需要将“正常”INT转换为字符串,并且您清除它:它不是必需的。我可以传递 2 个“正常”整数,并可能得到一个字符串结果,即 > PHP_INT_MAX
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多