最近在项目中遇到一个问题,测试服务器接口返回金额精度缺失,导致app解析不正确发生闪退。调试后发现浮点数在json_encode后损失了精度,如下图所示。

网上说是因为php7.1版本的serialize_precision配置不当导致,但是查看配置文件后发现配置正确,默认值为-1。

在服务器上测试浮点数运算如下:

测试后发现浮点数的加减运算会导致精度损失。

我们都知道计算机是通过二进制数存储浮点数的一个近似值,浮点数之间的比较和计算难免有误差。

单精度 float 的存储方式如下:

双精度 double 的存储方式如下:

php7.1版本可以通过设置serialize_precision和precision两个配置项来指定浮点数精度,但是也不能保证满足项目对于浮点数运算的严格要求。

解决方案是将项目中的金额单位从元(浮点数,保留两位小时)转成分(整型)运算,最后除以100避免了浮点数加减运算导致的精度损失。

示例代码如下:

/**

* 元转分

*

* @param $amount

* @return mixed

*/

public static function yuanToFen($amount)

{

return $amount * 100;

}

/**

* 分转元

*

* @param $amount

* @return float

*/

public static function fenToYuan($amount)

{

return $amount / 100;

}

/**

* 元相加运算,不损失精度

*

* @param $yuanAmounts

* @return int

*/

public static function yuanAdd(...$yuanAmounts)

{

$fenAmountTotal = 0;

foreach ($yuanAmounts as $yuanAmount) {

$fenAmountTotal += intval(self::yuanToFen(round($yuanAmount, 2)));

}

return self::fenToYuan($fenAmountTotal);

}

由于本地安装php7.1版本测试未发现相同现象,仔细对比服务器上配置后发现是由于precision配置项被改成-1所致。

综上,虽然这个问题主要原因是随意修改配置,且测试服务器php版本比生产环境的7.0版本高,但是生产环境也出现过浮点数精度导致的bug。因此,如果项目对浮点数精度要求严格,尤其是金融项目,建议将浮点数转成整型存储和运算,也有利于数据库存储查询的性能,减少不必要的困扰。

php7的浮点数,php7.1浮点数运算问题相关推荐

  1. C语言的本质(4)——浮点数的本质与运算

    C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...

  2. 考前自学系列·计算机组成原理·补码定点加减运算和溢出判断,浮点数的加减运算,原码的乘法

    补码定点加减运算和溢出判断 浮点数的加减运算 原码乘法

  3. 2.3.3 浮点数的加减运算与强制类型转换

    文章目录 0.思维导图 1.浮点数的加减运算 2.强制类型转换 0.思维导图 1.浮点数的加减运算 我们直接以一道题目来进行了解: 一般都要先转换格式: 2.强制类型转换

  4. 计组学习笔记(一):浮点数的表示和运算

    最近学习计算机组成原理,遇到许多疑难问题,接下来写一写我在学习浮点数方面知识的理解,在巩固的同时也方便日后的复习. 一.浮点数的表示 1.浮点数的表示格式 浮点数,顾名思义,就是小数点不固定的数.计算 ...

  5. 计算机组成原理浮点数左移规则,2020考研计算机组成原理知识点:浮点数的表示和运算...

    2020年计算机考研复习已经开始,新东方在线在此整理了2020考研计算机组成原理知识点:浮点数的表示和运算,希望能帮助大家! 浮点数的表示和运算 1. 浮点数的表示 1)浮点数的表示范围; 浮点数是指 ...

  6. 浮点数的运算 —— 浮点数的加减运算

    题目 阶码运算和尾数运算分开进行.浮点数的加减运算一律采用补码. 一.真值到机器数的转换 二.对阶 使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码加1 三.尾数加减 将对阶后的两个尾数按定点 ...

  7. 2.3.2 浮点数的加减运算

    加油哦棒棒哒(●• ̀ω•́ )✧取快递 要如何实现浮点数的运算呢?所以这个小节我们要探讨的是浮点数如何实现加减运算,那除了加减运算的实现之外,我们还会探讨浮点数,还有定点数之间的一个强制类型转换的问 ...

  8. 【组成原理-数据】浮点数的编码与运算

    文章目录 1 浮点数的格式 1.1 符号 (S) 1.2 阶码 (E) 1.3 尾数 (M) 2 IEEE 754 标准 2.1 短浮点数(float 型) 短浮点数的解释 2.2 长浮点数(doub ...

  9. 2.5 浮点数的表示及运算(浮点数乘除运算)

    2.5.3 浮点数的乘除法运算 运算步骤:         ①阶码加减         ②尾数的乘除         ③规格化操作         ④舍入操作         ⑤判断阶码溢出 具体步骤 ...

最新文章

  1. vex机器人比赛 一队人数_VEX世锦赛中国区总决赛在渝闭幕 重庆晚报记者带你了解VEX机器人的那些事...
  2. 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
  3. 《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作
  4. java 虚拟机类型的卸载_《深入理解Java虚拟机》:类加载和初始化(二)
  5. mysql语句没出错一直抱错_为什么我的mysql语句一直报错,找不到错误,望各位大佬指点一番...
  6. PAT (Basic Level) Practice1018 锤子剪刀布
  7. Github没有Download Zip(下载zip)的绿色选项是因为所在的是一个子目录
  8. 查询自己名下所有微信账户
  9. IFR202型红外雨量传感器非接触式检测降雨量的传感器
  10. 第55天:三战easy-dex
  11. python发微信提醒天气_基于Python实现定时自动给微信好友发送天气预报
  12. 计算机键盘优点,机械键盘有哪些优点
  13. 大数据产品推荐:百融信贷决策审批系统
  14. [转]微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
  15. 系列文章|闲鱼商品理解之精品库建设
  16. 如何从ADI官网下载PCB库
  17. DingTalk获取webhook
  18. 餐饮品牌推广方案PPT-朴尔PPT
  19. TextBox控件实例
  20. android开发必备日志打印工具类

热门文章

  1. wincc逻辑运算符_工控随笔_11_西门子_WinCC的VBS脚本_02_运算符
  2. Unity中SetPassCall, Batches的区别,它们与Draw call 的关系
  3. 计算机及统计学,统计学中及计算机视觉中的各种 距离 汇总。。。
  4. linux-patch用法
  5. 深度学习-BP神经网络(python3代码实现)
  6. kinhdown稳定版无法连接服务器,KinhDown稳定版
  7. python 路边停车
  8. C++中的随机数函数(
  9. WPF的Prism框架简介
  10. 数字图像处理——第七章(小波变换和多分辨率处理)