PHP浮点数引起的四舍五入问题

同事在开发中,遇到一个浮点数问题,过来问我,问题如下:

$a = 0.705;
$b = 20.795;
$c = 20.715;
$d = 20.745;

echo sprintf(‘%0.2f‘, $a) . ‘<br>‘; //0.70
echo sprintf(‘%0.2f‘, $b) . ‘<br>‘; //20.80
echo sprintf(‘%0.2f‘, $c) . ‘<br>‘; //20.71
echo sprintf(‘%0.2f‘, $d) . ‘<br>‘; //20.75

所有变量都取2位小数,从结果得知:$b 和 $d 四舍五入了,$a 和 $c 却没有。

同样第三位小数都是5,怎么会出现这种情况呢?

同过查阅文档,调试

echo sprintf(‘%0.20f‘, $a). ‘<br>‘; // 0.70499999999999996003
echo sprintf(‘%0.20f‘, $b). ‘<br>‘; // 20.79500000000000170530
echo sprintf(‘%0.20f‘, $c). ‘<br>‘; // 20.71499999999999985789
echo sprintf(‘%0.20f‘, $d). ‘<br>‘; // 20.74500000000000099476

显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

时间: 2024-10-10 17:16:26

PHP浮点数引起的四舍五入问题的相关文章

float浮点数的四舍五入

瑞生网http://www.rationmcu.com版权所有 前几天,有个小伙伴在做实验过程中,发现了一个奇怪的现象,这个现象就是… 他在用printf输出浮点数的时候,想把数据保留到小数点后的两位,他是这么写的… float c=1.155;printf(“%.2f”,c); 他的书写是对的,没有错误.但是他发现,当c等于1.555时,保留两位小数输出是1.55,而当c等于3.555时,保留两位小数输出是3.56.这个结果,就让人捉摸不透了,因为… 如果是程序运算会自动四舍五入的话,结果应该

对小数的四舍五入算法

Description: 仅仅能对最多6位小数进行四舍五入,注意小数末尾自己主动去0不占位(比如:1.20f被看做:1.2f),当传入的小数为2.0f这种小数时视为整数返回0: 被解决的问题: 在Unity3d圣典中的四舍五入函数Mathf.Round返回浮点数 f 进行四舍五入最接近的整数.假设数字末尾是.5,因此它是在两个整数中间,无论是偶数或是奇数,将返回偶数. Code:[C#,Unity3d圣典] float MyRound(float f) { string s = f.ToStri

Python 基础学习之: Python math 模块、cmath 模块 区别是 cmath 模块运算的是复数,math 模块运算的是数学运算 Python数学函数列表及解释 Python math 模块提供了许多对浮点数的数学运算函数。 Python cmath 模块包含了一些用于复数运算的函数

Python math 模块.cmath 模块 Python 中数学运算常用的函数基本都在 math 模块.cmath 模块中. Python math 模块提供了许多对浮点数的数学运算函数. Python cmath 模块包含了一些用于复数运算的函数. cmath 模块的函数跟 math 模块函数基本一致,区别是 cmath 模块运算的是复数,math 模块运算的是数学运算. 要使用 math 或 cmath 函数必须先导入: import math 查看 math 查看包中的内容: impo

四舍五入就用round( )?Python四舍五入的正确打开方式!

菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值. > round( x [, n] )1参数x,n均为数值表达式,返回值为x的四舍五入值.n为保留的小数位数,不加n则只保留x四舍五入后的整数部分. >>> round(2.3)2>>> round(2.45, 1)2.51234特殊情况上面的结果并没有错误,这里再用2.675测试一下: >>> round(2.675, 2)2.6712显然结果不符合四舍五入的规则.为什么

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

Unity3d学习笔记(持续更新)。。。

[转]自http://blog.csdn.net/quannenggou/article/details/7204172 Mathf 数学运算 Mathf.Abs绝对值 计算并返回指定参数 f 绝对值. Mathf.Acos反余弦 static function Acos (f : float) : float 以弧度为单位计算并返回参数 f 中指定的数字的反余弦值. Mathf.Approximately近似 static function Approximately (a : float,

【bzoj3450】Tyvj1952 Easy

题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有a*a分,comb就是极大的连续o.比如ooxxxxooooxxx,分数就是2*2+4*4=4+16=20.Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示.比如oo?xx就是一个可能的输入.那么WJMZBMR这场osu的

MYSQL基础笔记(六)- 数据类型一

数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期类型. 一.数值型 数值型数据,都是数值. 系统讲数值型分为整数型和小数型. 整数型:存放整数型数据,在SQL中考虑为了节约磁盘空间,系统将整形又细分成了5类. Tinyint:迷你整型,使用一个字节存储, 表示状态最多为256种.(常用) Smallint :小整型,使用2个字节存储,表示状态最对

Python基础学习笔记

Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读:Python代码定义的更清晰. 3.易于维护:Python的成功在于它的源代码是相当容易维护的. 4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好. 5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断. 6.可移植:基于其开放源代码的特性,Py