php浮点型以及精度问题
浮点型(也叫浮点数 float,双精度数 double 或实数 real)
浮点数的形式表示:
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
浮点数的精度问题
浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
NaN
某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。
浮点数比较的问题
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等,但是你可以比较出浮点数的后几位是否相等
<?php
if((0.01 + 0.003) == 0.013)
echo 'equal';
else
echo 'unequal';
//结果为unequal
/**
* bccomp 比较做操作数和右操作数,以整型的形式返回结果
* @param string $left_operand 左操作数
* @param string $right_operand 右操作数
* @param int $scale 用于比较小数点后的位数默认为2
* @return int 0表示两个数是相等的,1表示左操作数大,-1表示右操作数大
**/
$iResult = bccomp((0.01 + 0.003), 0.013, 3);
if(!$iResult)
echo 'the two operands are equal';
elseif($iResult > 0)
echo 'left_operand is larger than the right_operand';
elseif($iResult < 0)
echo 'right_operand is larger than the left_operand';
else
echo 'unknown result';
//the two operands are equal
?>
php浮点型以及精度问题的更多相关文章
- 浮点型 float和double类型的内存结构和精度问题
首先引用一个例子在java中可能你会遇到这样的问题: 例:0.99999999f==1f //true 0.9999999f==1f //false 这是超出精度造成的,为了知道为什么会造成这样的问题 ...
- python 基础 1.5 python 数据类型(一)--整型 浮点型 布尔型及字符串和常用方法
一.python 数据类型:数值,字符串,列表,元组,字典.以下操作是在linux 下 ipython中进行 1.数值 1>123 与 “123”的区别 答:123为数值,“123”在pyt ...
- Java 类型转换精度问题
基本数据类型占用内存大小 最近项目中修复了一个关于类型转换精度丢失的问题,以前对于类型转换会丢失精度只知其然,不知其所以然,这次了解了下相关原理,也分享给大家.先来回顾一下 Java 的基本数据类型中 ...
- MySQL基本数据类型
MySQL数据类型包括:整型.浮点型.日期类型.字符型,这里用表格的方式详细说明每个数据类型,这些只要记住常用的即可,需要再查阅. 整型 数据类型 存储范围 字节 TINYINT 有符号值:-128 ...
- 易学PHP——PHP基础知识
PHP 语言标记 因为 PHP 是兼容当时的主流语言,所以 PHP 有四种标记方式: <?php PHP 代码 ?>.这是 PHP 最为正宗的语言标记,称为标准风格标记.XML 风格标记等 ...
- 【收藏】Firebird知识
本代码在:WinXp Pack 3 + Delphi2009 updata1 火鸟Firebird2.5.0.23247下测试通过.使用了Data Access面板的组件用SQL进行操作作者:LAH ...
- if
语句快中的变量与函数的局部变量关系;
- Python学习笔记:02数据类型
Python 数据类型 python中标准的数据类型有 基础类型 整型(长整型) 浮点型 复数型 布尔型 序列类型 字符串 列表 元组 字典 整型 整型和长整型并不严格区分,整型int的表达范围和计算 ...
- C#的数据类型、数据类型的转化
一.c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object)这里主要说明整型.浮点型.布尔型以及引用型 1.整型数据 2.浮点型 浮点型从精度有低到高有float. ...
随机推荐
- C#获取url中参数键值对的方法
方法如下: /// <summary> /// 遍历Url中的参数列表 /// </summary> /// <returns>如:(?userName=keley ...
- Linq之Lambda表达式
一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...
- 小白学Linux(四)--系统常用命令
这里记录一下基础的系统常用命令,都是日常可能用到的,需要记住的一些命令.主要分为5个模块:关于时间,输出/查看,关机/重启,压缩归档和查找. 时间: date :查看设置当前系统时间,dat ...
- 小白学Linux(二)--命令行基本操作
安装完Ubuntu后,进入系统,呈现在眼前的是Ubuntu的界面,跟windows的差不太多.一般操作系统包含GUI和CLI.GUI就是我们现在看到的,也是windows常用的直接用拖拽,点击等操作对 ...
- Java文件编码自动转换工具类(只改变编码,不会改变文件内容)
本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...
- Access restriction : The constructor BASE64Decoder() is not accessible due to restriction on required library
1.问题描述 找不到包 sun.misc.BASE64Encoder 2. 解决方案 只需要在project build path中先移除JRE System Library,再添加库JRE Sys ...
- sso demo ( cas )
1. generate keystore command : keytool -genkey -alias testtomcat -keyalg RSA -keystore "C:\User ...
- Linux Shell系列教程之(十五) Shell函数简介
本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...
- linux下firefox手工安装flash插件
1. 前往adobe官网,下载flash安装包.下载.tar.gz安装包即可.2. 解压安装包,得到libflashplayer.so文件3. 新建文件夹,~/.mozilla/plugins4. 拷 ...
- TCP中close和shutdown之间的区别
该图片截取自<<IP高效编程-改善网络编程的44个技巧>>,第17个技巧. 如果想验证可以写个简单的网络程序,分别用close和shutdown来断开连接,然后用tcpdum ...