php整数和浮点数比较,php 浮点数怎么进行比较?
浮点数在转换过程中都会有误差的,所以浮点数不能直接比较其大小,一般在比较两个浮点数的时候是比较他们之间的差值,如果两个数之间的差值处于一个能接受的范围之内的话,那么,我们就认为这两个浮点数是相等的。本篇文章主要介绍了php浮点数比较方法,具有很好的参考价值。下面跟着小编一起来看下吧
浮点数运算精度问题
首先看一个例子:<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($a+$b)==$c);
var_dump(($c-$b)==$a);
?>
$a+$b==$c 返回true,正确
$c-$b==$a 返回false,错误
为什么会这样呢?
运算后,精度为20位时实际返回的内容如下:<?php
$a = 0.1;
$b = 0.9;
$c = 1;
printf("%.20f", $a+$b); // 1.00000000000000000000
printf("%.20f", $c-$b); // 0.09999999999999997780
?>
$c-$b 为 0.09999999999999997780,因此与0.1比较返回false
出现这个问题是因为浮点数计算涉及精度,当浮点数转为二进制时有可能会造成精度丢失。
浮点数转二进制方法
整数部分采用除以2取余方法
小数部分采用乘以2取整方法
例如:把数字8.5转为二进制
整数部分是8
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0
1比2小,因此不需要计算下去,整数8的二进制为 1000
小数部分是0.5
0.5x2 = 1.0
因取整后小数部分为0,因此不需要再计算下去
小数0.5的二进制为 0.1
8.5的二进制为1000.1
计算数字0.9的二进制
0.9x2=1.8
0.8x2=1.6
0.6x2=1.2
0.2x2=0.4
0.4x2=0.8
0.8x2=1.6
…. 之后不断循环下去,当截取精度为N时,N后的数会被舍去,导致精度丢失。
上例中0.9在转为二进制时精度丢失,导致比较时出现错误。
所以永远不要相信浮点数已精确到最后一位,也永远不要比较两个浮点数是否相等。
正确比较浮点数的方法
1.使用round方法处理后再比较
例子:<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a); // false
var_dump(round(($c-$b),1)==round($a,1)); // true
?>
2.使用高精度运算方法
首先进行运算时,使用高精度的运算方法,这样可以保证精度不丢失。
高精度运算的方法如下:
bcadd将两个高精度数字相加
bccomp比较两个高精度数字,返回-1,0,1
bcp 将两个高精度数字相除
bcmod 求高精度数字余数
bcmul 将两个高精度数字相乘
bcpow 求高精度数字乘方
bcpowmod 求高精度数字乘方求模
bcscale 配置默认小数点位数,相当于Linux bc中的”scale=”
bcsqrt 求高精度数字平方根
bcsub将两个高精度数字相减
例子:<?php
$a = 0.1;
$b = 0.9;
$c = 1;
var_dump(($c-$b)==$a); // false
var_dump(bcsub($c, $b, 1)==$a); // true
?>
php整数和浮点数比较,php 浮点数怎么进行比较?相关推荐
- 整数存储怎么转化为浮点数_非整数值如何存储在浮点数中(以及为什么要浮点数)...
整数存储怎么转化为浮点数 by Shukant Pal 通过Shukant Pal 非整数值如何存储在浮点数中(以及为什么要浮点数) (How non-integer values are store ...
- c语言 准确赋值浮点数,C语言浮点数
浮点数的概念 浮点数也称小数或实数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数.这是常见的小数的表现形式,称为十进制形式. C语言中采用float和double关键 ...
- 计算机中浮点数的表示,浮点数在计算机中的表示
浮点数在计算机中的表示 最后编辑于:2010-4-13 计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢? 一. 转换 我们先来看看如何将十进制 ...
- 计算机浮点数的知识,浮点数基础知识科普
浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数 ...
- 计算机组成原理(六)-浮点数存储和浮点数计算
你的程序.打开的文本为什么老是乱码?先来认识一下世界的编码集 ASCII:因为最开始计算机是美国人发明的,所以最早的编码集只为美国服务,包含95个可打印字符,33个不可打印字符(包括控制字符)一共12 ...
- python的浮点数_python中浮点数的精度
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python中,浮点数运算,经常会碰到如下情况:? 出现上面的情况,主要还是因浮 ...
- java中单精度浮点数和双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...
作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型首先明确java中浮点型数据类型主要有:单精度float.双精度do ...
- 单精度浮点数和双精度浮点数存储
IEEE 754中 单精度浮点数和双精度浮点数存储 IEEE 754中 单精度浮点数和双精度浮点数存储 我们先了解一下 单精度浮点数 和 双精度浮点数 的基本信息. 名称 占用内存(bit;位) 内存 ...
- 单精度在计算机中的存储,浮点数(单精度浮点数与双精度浮点数)在计算机中的存储...
浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数.科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分 ...
- 单精度浮点数和双精度浮点数有什么区别
如果被人问道,单精度浮点数和双精度浮点数有什么区别? 可以这样回答: 1.单精度是8位有效数字,双精度是16位有效数字 2.双精度比单精度占用内存大 float占4个字节(32位)内存空间 doubl ...
最新文章
- (九)javaScript的基本使用
- eclipse中编辑properties文件无法看到中文
- python导入csv文件-jupyter 导入csv文件方式
- STM32 基础系列教程 1- CubeMX+GPIO
- 为什么大多数同学宁愿吃学习的苦,也不愿意尝思考的痛?
- 数据库SQL基础知识点
- apache目录的访问控制
- [译] Airbnb 在 React Native 上下的赌注(一):概述
- LeetCode 1618. 找出适应屏幕的最大字号(二分查找)
- Java集合之LinkedHashMap源码分析
- 统计天数(洛谷-P1567)
- 香港科技大学TensorFlow速成(1)
- visual studio 容器工具首次加载太慢 vsdbg\vs2017u5 exists, deleting 的解决方案
- ArrayList 类方法toArray的一点疑惑
- 在Android关机中插入脚本
- MySQL-第十三篇使用ResultSetMetaData分析结果集
- 三菱 MX COMPONENT下载及安装测试
- 离散元颗粒流软件PFC3D6.0仿真案例教学应用
- php电子面单打印快递100,使用快递100软件打印电子面单设置操作教程
- [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
热门文章
- 宝塔部署node项目_SFF一站式node服务管理平台实践
- [Leetcode] Reorder List
- asp.net2.0 GridView 导出到 Excel
- WebDriverAgent安装
- 最新的 iOS 申请证书与发布流程
- 在配置文件web.xml中配置Struts2的启动信息
- Struts2之类型转换器
- 在WCF中使用Ninject轻量级IOC框架 之 SOAP风格服务
- luogu 4884 多少个1 (BSGS)
- 【BZOJ4660】Crazy Rabbit 结论+DP