浮点数

浮点数( float,一般是钱币,地理位置等)是一种不“稳定”的数据类型,直接操作或者转换后会出现数值“细微变更”的情况。

Note: 浮点数的小数部分是不稳定的,一定要注意精度丢失问题

范例

基本用法

[运行代码]

$f = 1/3;
var_dump($f);
$r = round($f, 2);
var_dump($r);

[执行结果]

float(0.33333333333333)
float(0.33)

浮点数转整数精度丢失

[运行代码]

echo (int) ( (0.1+0.7) * 10 ); // 显示 7!

[执行结果]

7

注意事项

为了保证浮点数精度,可以采用如下方法:

  1. PHP中推荐使用 bcmath 函数(需要装扩展 http://php.net/bc)。
  2. MySQL数据库使用decimial,或者乘以10的倍数将其转成转成 int 。
  3. protobuf 中可以使用 string 来代替 float。

BC数学函数

  • bcadd() — 2个任意精度数字的加法计算
  • bccomp() — 比较两个任意精度的数字
  • bcdiv() — 2个任意精度的数字除法计算
  • bcmod() — 对一个任意精度数字取模
  • bcmul() — 2个任意精度数字乘法计算
  • bcpow() — 任意精度数字的乘方
  • bcpowmod() — Raise an arbitrary precision number to another, reduced by a specified modulus
  • bcscale() — 设置所有bc数学函数的默认小数点保留位数
  • bcsqrt() — 任意精度数字的二次方根
  • bcsub() — 2个任意精度数字的减法

数值函数

  • abs() — 绝对值
  • acos() — 反余弦
  • acosh() — 反双曲余弦
  • asin() — 反正弦
  • asinh() — 反双曲正弦
  • atan2() — 两个参数的反正切
  • atan() — 反正切
  • atanh() — 反双曲正切
  • base_convert() — 在任意进制之间转换数字
  • bindec() — 二进制转换为十进制
  • ceil() — 进一法取整
  • cos() — 余弦
  • cosh() — 双曲余弦
  • decbin() — 十进制转换为二进制
  • dechex() — 十进制转换为十六进制
  • decoct() — 十进制转换为八进制
  • deg2rad() — 将角度转换为弧度
  • exp() — 计算 e 的指数
  • expm1() — 返回 exp(number) - 1,甚至当 number 的值接近零也能计算出准确结果
  • floor() — 舍去法取整
  • fmod() — 返回除法的浮点数余数
  • getrandmax() — 显示随机数最大的可能值
  • hexdec() — 十六进制转换为十进制
  • hypot() — 计算一直角三角形的斜边长度
  • intdiv() — 对除法结果取整
  • is_finite() — 判断是否为有限值
  • is_infinite() — 判断是否为无限值
  • is_nan() — 判断是否为合法数值
  • lcg_value() — 组合线性同余发生器
  • log10() — 以 10 为底的对数
  • log1p() — 返回 log(1 + number),甚至当 number 的值接近零也能计算出准确结果
  • log() — 自然对数
  • max() — 找出最大值
  • min() — 找出最小值
  • mt_getrandmax() — 显示随机数的最大可能值
  • mt_rand() — 生成更好的随机数
  • mt_srand() — 播下一个更好的随机数发生器种子
  • octdec() — 八进制转换为十进制
  • pi() — 得到圆周率值
  • pow() — 指数表达式
  • rad2deg() — 将弧度数转换为相应的角度数
  • rand() — 产生一个随机整数
  • round() — 对浮点数进行四舍五入
  • sin() — 正弦
  • sinh() — 双曲正弦
  • sqrt() — 平方根
  • srand() — 播下随机数发生器种子
  • tan() — 正切
  • tanh() — 双曲正切

参考资料