浮点数乘积的取整intval,以及高精度函数bcmath的使用
线上发现个bug,浮点数乘积以后取整,得到的数不符预期。还记得上次踩过的坑是数据库类型转换的一个问题。这个也相当于类型转换了..尴尬
浮点数计算的精度一定要谨慎。
例子如下:
<?php $a = 18359.1; $b = $a * 100;// float(1835910) $c = intval($a * 100);// int(1835909) var_dump($b); var_dump($c);
究其原因,就是浮点数的二进制表示。当遇到循环的情况,就会出现这种问题。比如 18359.1 * 100在二进制运算结果后,转十进制,得到的会是1835909.99999...
这样intval()以后,便是1835909了。
知道了这样的问题,有啥更好的方案么?
可以使用bcmath扩展,高精度函数的使用。bc 全称 Binary Calculator,二进制计算器。
用法见php文档:http://php.net/manual/zh/function.bcadd.php
bcadd — 加法
bccomp — 比较
bcdiv — 相除
bcmod — 求余数
bcmul — 乘法
bcpow — 次方
bcpowmod — 先次方然后求余数
bcscale — 给所有函数设置小数位精度
bcsqrt — 求平方根
bcsub — 减法
bc库的加减乘除的返回值是string字符串类型。这点值得注意,可以设置第三个参数,小数点位数。
浮点数乘积的取整intval,以及高精度函数bcmath的使用的更多相关文章
- java中的小数的取整的几种函数
Math类中提供了5个与取整相关的函数,如下所示: static double ceil(double a):天花板函数,返回大于等于a的最小整数(但是以浮点数形式存储). static double ...
- mysql取整,小数点处理函数floor(), round()
mysql数值处理函数floor与round 在mysql中,当处理数值时,会用到数值处理函数,如有一个float型数值2.13,你想只要整数2,那就需要下面的函数floor与round. ...
- 关于Matlab里面的四个取整(舍入)函数:Floor, Ceil, Fix, Round的解释(转)
转自http://blog.sina.com.cn/s/blog_48ebd4fb010009c2.html floor:朝负无穷方向舍入 B = floor(A) rounds the elem ...
- PHP数据如何向上取整
PHP数据如何向上取整? PHP数据向上取整可以通过ceil()函数来实现,ceil()函数表示向上舍入为最接近的整数. 语法是: 1 ceil(x) 参数 x 必需.一个数. 说明 返回不小于 x ...
- php浮点数计算比较及取整不准确解决方法
原文:php浮点数计算比较及取整不准确解决方法 php有意思的现象,应该是很多编程语言都会有这样的现象.这个是因为计算机的本身对浮点数识别的问题..... $f = 0.58; var_dump(in ...
- Objective-C浮点数转化整数(向上取整、向下取整)
Objective-C拓展了C,自然很多用法是和C一致的.比如浮点数转化成整数,就有以下四种情况. 1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLo ...
- php对浮点数小数取整,php除法取整数
如果我们使用" / "操作符进行除法运算时,如果遇到无法除尽的情况,会得到小数值.如果我只希望得到整数部分,怎么办呢? 1.round — 对浮点数进行四舍五入 float rou ...
- Python技法:浮点数取整、格式化和NaN处理
1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...
- lua浮点数取整
向下取整 math.floor(num) 向上取整 math.ceil(num) 取整取余 math.modf(num) 测试 num = 12.4 print(math.floor(num)) 12 ...
随机推荐
- .NET快速信息化系统开发框架 V3.2 -> Web 用户管理模块编辑界面-组织机构选择支持级联选择
下拉框级联选择功能非常的实用,框架用户管理编辑界面对组织机构的选择在3.2版本中新增了级联选择的支持,让组织机构的选择更加的方便与高效,也不容易出错. 我们框架的组织机构结合实际分成了5种类型,分别为 ...
- Apache coredump 问题发现与解决记录
目录 Apache coredump 问题发现与解决记录 背景 发现问题 解决问题 方法 1 方法 2 总结 Linux 程序编译链接动态库版本问题 ldd 命令 动态库的编译和 soname 线上 ...
- springboot情操陶冶-web配置(六)
本文则针对数据库的连接配置作下简单的分析,方便笔者理解以及后续的查阅 栗子当先 以我们经常用的mybatis数据库持久框架来操作mysql服务为例 环境依赖 1.JDK v1.8+ 2.springb ...
- .NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码
前言 上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试,但是实际上Swagger附带的功能还有很多, 比如使用NSwag生成客户端调用代码,进一步解放接口开发者. N ...
- springboot集成下,mybatis的mapper代理对象究竟是如何生成的
前言 开心一刻 中韩两学生辩论. 中:端午节是属于谁的? 韩:韩国人! 中:汉字是谁发明的? 韩:韩国人! 中:中医是属于谁的? 韩:韩国人! 中:那中国人到底发明过什么? 韩:韩国人! 前情回顾 M ...
- Python之文件和目录操作
1.文件基本操作 python内置了打开文件的函数open(),使用规则如下: File_object=open(filename[,access_mode][,buffering]) Filen ...
- 分析解剖微服务系列(二)-SOA和微服务异同
微服务架构模式成熟之前,软件领域讨论的比较多的是SOA的架构模式.SOA早在1996年就由Gartner提出,作为面向服务的架构模式,SOA的理念是对于复杂的企业IT系统,按照不同的.可重用的粒度划分 ...
- 史上最全python面试题详解(四)(附带详细答案(关注、持续更新))
python高级进阶-网络编程和并发(?道题详解) 1.简述 OSI 七层协议. OSI是Open System Interconnection的缩写,意为开放式系统互联. OSI七层协议模型主要是: ...
- TabLayout您可能不知道的实用用法
一.修改点击的动画 函数:setUnboundedRipple 这是默认的点击的动画 我们用代码修改一下: mGlueTabLayout.setUnboundedRipple(true); 这是之后的 ...
- WPF:间接支持虚拟化的ListBox
/// <summary> /// 间接实现了虚拟化的ListBox /// 子项必须实现IVisible接口 /// 你可以在IsVisible发生改变时实现一系列自定义动作 /// 比 ...