浮点数在转换过程中都会有误差的,所以浮点数不能直接比较其大小,一般在比较两个浮点数的时候是比较他们之间的差值,如果两个数之间的差值处于一个能接受的范围之内的话,那么,我们就认为这两个浮点数是相等的。本篇文章主要介绍了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 浮点数怎么进行比较?相关推荐

  1. 整数存储怎么转化为浮点数_非整数值如何存储在浮点数中(以及为什么要浮点数)...

    整数存储怎么转化为浮点数 by Shukant Pal 通过Shukant Pal 非整数值如何存储在浮点数中(以及为什么要浮点数) (How non-integer values are store ...

  2. c语言 准确赋值浮点数,C语言浮点数

    浮点数的概念 浮点数也称小数或实数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数.这是常见的小数的表现形式,称为十进制形式. C语言中采用float和double关键 ...

  3. 计算机中浮点数的表示,浮点数在计算机中的表示

    浮点数在计算机中的表示 最后编辑于:2010-4-13 计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢? 一.    转换 我们先来看看如何将十进制 ...

  4. 计算机浮点数的知识,浮点数基础知识科普

    浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数 ...

  5. 计算机组成原理(六)-浮点数存储和浮点数计算

    你的程序.打开的文本为什么老是乱码?先来认识一下世界的编码集 ASCII:因为最开始计算机是美国人发明的,所以最早的编码集只为美国服务,包含95个可打印字符,33个不可打印字符(包括控制字符)一共12 ...

  6. python的浮点数_python中浮点数的精度

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python中,浮点数运算,经常会碰到如下情况:? 出现上面的情况,主要还是因浮 ...

  7. java中单精度浮点数和双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...

    作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型首先明确java中浮点型数据类型主要有:单精度float.双精度do ...

  8. 单精度浮点数和双精度浮点数存储

    IEEE 754中 单精度浮点数和双精度浮点数存储 IEEE 754中 单精度浮点数和双精度浮点数存储 我们先了解一下 单精度浮点数 和 双精度浮点数 的基本信息. 名称 占用内存(bit;位) 内存 ...

  9. 单精度在计算机中的存储,浮点数(单精度浮点数与双精度浮点数)在计算机中的存储...

    浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数.科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分 ...

  10. 单精度浮点数和双精度浮点数有什么区别

    如果被人问道,单精度浮点数和双精度浮点数有什么区别? 可以这样回答: 1.单精度是8位有效数字,双精度是16位有效数字 2.双精度比单精度占用内存大 float占4个字节(32位)内存空间 doubl ...

最新文章

  1. (九)javaScript的基本使用
  2. eclipse中编辑properties文件无法看到中文
  3. python导入csv文件-jupyter 导入csv文件方式
  4. STM32 基础系列教程 1- CubeMX+GPIO
  5. 为什么大多数同学宁愿吃学习的苦,也不愿意尝思考的痛?
  6. 数据库SQL基础知识点
  7. apache目录的访问控制
  8. [译] Airbnb 在 React Native 上下的赌注(一):概述
  9. LeetCode 1618. 找出适应屏幕的最大字号(二分查找)
  10. Java集合之LinkedHashMap源码分析
  11. 统计天数(洛谷-P1567)
  12. 香港科技大学TensorFlow速成(1)
  13. visual studio 容器工具首次加载太慢 vsdbg\vs2017u5 exists, deleting 的解决方案
  14. ArrayList 类方法toArray的一点疑惑
  15. 在Android关机中插入脚本
  16. MySQL-第十三篇使用ResultSetMetaData分析结果集
  17. 三菱 MX COMPONENT下载及安装测试
  18. 离散元颗粒流软件PFC3D6.0仿真案例教学应用
  19. php电子面单打印快递100,使用快递100软件打印电子面单设置操作教程
  20. [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

热门文章

  1. 宝塔部署node项目_SFF一站式node服务管理平台实践
  2. [Leetcode] Reorder List
  3. asp.net2.0 GridView 导出到 Excel
  4. WebDriverAgent安装
  5. 最新的 iOS 申请证书与发布流程
  6. 在配置文件web.xml中配置Struts2的启动信息
  7. Struts2之类型转换器
  8. 在WCF中使用Ninject轻量级IOC框架 之 SOAP风格服务
  9. luogu 4884 多少个1 (BSGS)
  10. 【BZOJ4660】Crazy Rabbit 结论+DP