php7的浮点数,php7.1浮点数运算问题
最近在项目中遇到一个问题,测试服务器接口返回金额精度缺失,导致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浮点数运算问题相关推荐
- C语言的本质(4)——浮点数的本质与运算
C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...
- 考前自学系列·计算机组成原理·补码定点加减运算和溢出判断,浮点数的加减运算,原码的乘法
补码定点加减运算和溢出判断 浮点数的加减运算 原码乘法
- 2.3.3 浮点数的加减运算与强制类型转换
文章目录 0.思维导图 1.浮点数的加减运算 2.强制类型转换 0.思维导图 1.浮点数的加减运算 我们直接以一道题目来进行了解: 一般都要先转换格式: 2.强制类型转换
- 计组学习笔记(一):浮点数的表示和运算
最近学习计算机组成原理,遇到许多疑难问题,接下来写一写我在学习浮点数方面知识的理解,在巩固的同时也方便日后的复习. 一.浮点数的表示 1.浮点数的表示格式 浮点数,顾名思义,就是小数点不固定的数.计算 ...
- 计算机组成原理浮点数左移规则,2020考研计算机组成原理知识点:浮点数的表示和运算...
2020年计算机考研复习已经开始,新东方在线在此整理了2020考研计算机组成原理知识点:浮点数的表示和运算,希望能帮助大家! 浮点数的表示和运算 1. 浮点数的表示 1)浮点数的表示范围; 浮点数是指 ...
- 浮点数的运算 —— 浮点数的加减运算
题目 阶码运算和尾数运算分开进行.浮点数的加减运算一律采用补码. 一.真值到机器数的转换 二.对阶 使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码加1 三.尾数加减 将对阶后的两个尾数按定点 ...
- 2.3.2 浮点数的加减运算
加油哦棒棒哒(●• ̀ω•́ )✧取快递 要如何实现浮点数的运算呢?所以这个小节我们要探讨的是浮点数如何实现加减运算,那除了加减运算的实现之外,我们还会探讨浮点数,还有定点数之间的一个强制类型转换的问 ...
- 【组成原理-数据】浮点数的编码与运算
文章目录 1 浮点数的格式 1.1 符号 (S) 1.2 阶码 (E) 1.3 尾数 (M) 2 IEEE 754 标准 2.1 短浮点数(float 型) 短浮点数的解释 2.2 长浮点数(doub ...
- 2.5 浮点数的表示及运算(浮点数乘除运算)
2.5.3 浮点数的乘除法运算 运算步骤: ①阶码加减 ②尾数的乘除 ③规格化操作 ④舍入操作 ⑤判断阶码溢出 具体步骤 ...
最新文章
- vex机器人比赛 一队人数_VEX世锦赛中国区总决赛在渝闭幕 重庆晚报记者带你了解VEX机器人的那些事...
- 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
- 《Python Cookbook 3rd》笔记(3.16):结合时区的日期操作
- java 虚拟机类型的卸载_《深入理解Java虚拟机》:类加载和初始化(二)
- mysql语句没出错一直抱错_为什么我的mysql语句一直报错,找不到错误,望各位大佬指点一番...
- PAT (Basic Level) Practice1018 锤子剪刀布
- Github没有Download Zip(下载zip)的绿色选项是因为所在的是一个子目录
- 查询自己名下所有微信账户
- IFR202型红外雨量传感器非接触式检测降雨量的传感器
- 第55天:三战easy-dex
- python发微信提醒天气_基于Python实现定时自动给微信好友发送天气预报
- 计算机键盘优点,机械键盘有哪些优点
- 大数据产品推荐:百融信贷决策审批系统
- [转]微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
- 系列文章|闲鱼商品理解之精品库建设
- 如何从ADI官网下载PCB库
- DingTalk获取webhook
- 餐饮品牌推广方案PPT-朴尔PPT
- TextBox控件实例
- android开发必备日志打印工具类
热门文章
- wincc逻辑运算符_工控随笔_11_西门子_WinCC的VBS脚本_02_运算符
- Unity中SetPassCall, Batches的区别,它们与Draw call 的关系
- 计算机及统计学,统计学中及计算机视觉中的各种 距离 汇总。。。
- linux-patch用法
- 深度学习-BP神经网络(python3代码实现)
- kinhdown稳定版无法连接服务器,KinhDown稳定版
- python 路边停车
- C++中的随机数函数(
- WPF的Prism框架简介
- 数字图像处理——第七章(小波变换和多分辨率处理)