关于PHP浮点数

今天在接触一道题目的时候发现了数组中使用浮点数做键值时的情况,看代码:


$arr = array();
$arr[3.14] = "test";
echo $arr["3"]; //结果输出是"test"

从而发现了在数组中键值的一些需要注意的地方

此外 key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type

另外需要注意的是浮点数的计算:

$a = 0.2+0.7; 
$b = 0.9; 
printf("%0.20f", $a); 
echo '<br />'; 
printf("%0.20f", $b);
输出的结果是:
0.89999999999999991118 
0.90000000000000002220

因此使用$a==$b或者$a===$b都是返回false

要解决这个问题:使用 bcadd() 函数来对浮点数想加并进行精度转换(为字符串)

bcadd(0.2,0.7,1) == 0.9 //return true

转载于:https://my.oschina.net/haigou20/blog/153018

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值