浮点数的比较

在大多数的语言中,不指定精度的浮点数不能直接比较,会出现很多意想不到的结果。

例子:

$price1 = 9.8*100;
$price2 = floatval(980);
var_dump($price1);
var_dump($price2);
var_dump($price1 == $price2);
结果float(980)
float(980)
bool(false)

上面两个变量看着是一样的,用var_dump打印出来都是浮点数980,比较两个数结果是false,是不是有点儿晕。

我们格式化输出一下两个数

printf("%.50f", $price1);
echo("<br/>");
printf("%.50f", $price1);
980.00000000000011368683772161602973937988281250000000980.00000000000011368683772161602973937988281250000000

打印了这么长还是一样,还是不能证明这两个数相等的,浮点数计算涉及精度,当浮点数转为二进制时有可能会造成精度丢失。

上面的例子不太明显的能体现出来,我们换个

printf("%.50f", 1-0.9);
echo("<br/>");
printf("%.50f", 0.1);
0.099999999999999977795539507496869191527366638183590.10000000000000000555111512312578270211815834045410

这样就看出来了吧!

不要盲目的比较两个浮点数的大小。

时间: 2024-10-25 23:18:31

浮点数的比较的相关文章

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

单精度浮点数

单精度浮点数格式 是一种计算机数据格式,在计算机存储器中占用4个字节(32 bits),利用"浮点"(浮动小数点)的方法,可以表示一个范围很大的数值. 在 IEEE 754-2008 的定义中,32-bit base 2格式被正式称为binary32格式.这种格式在IEEE 754-1985被定义为single,即单精度. 需要注意的是,在更早的一些计算机系统中,也存在着其他4字节的浮点数格式. 定义 第1位表示正负,中间8位表示指数,后23位表示有效数位. 正负号0代表正,1代表负.

Javascript优化后的加减乘除(解决js浮点数计算bug)

说明 众所周知,js在计算浮点数时候,结果可能会不准确.比如:(在chrome中的运算结果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.840000000000001 2.1 / 0.3 = 7.000000000000001 网上流传的代码(有bug) 网上流传的优化后的代码如下(有问题的代码,请勿使用) function add(a, b) { var c, d, e; try {

Java 浮点数 float或double类型的表示范围和精度

隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数.有时候会产生让人觉得莫名其妙的事情. 如在java中, 0.99999999f==1f //true 0.9f==1f //false 要明白这些,首先要搞清楚float和double在内存结构 1.内存结构 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) dou

浮点数问题

(1)浮点数是有理数的集合,有些有理数不能表示,会有舍去误差如0.1等. (2)浮点数可以表示的连续整数也是有限的. 有些脚本语言,比如awk,lua中都是使用浮点数来存储整数的,也就是说,我们在语言中使用的整数,在语言内部是使用浮点数来表示的.我们知道,浮点数的运算中通常存在着一定的误差,所以整数是否能被浮点数精确表示呢?答案是可以,不过不是所有范围的整数都可以被精确的表示.由于浮点数精度的问题,所以浮点数的分布也就呈现出非均匀分布. 先简单介绍一下一个常用的浮点数在计算机中的组成,最常用的浮

NOI-1.3-11-计算浮点数相除的余数

11:计算浮点数相除的余数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 计算两个双精度浮点数a和b的相除的余数,a和b都是正数的.这里余数(r)的定义是:a = k * b + r,其中 k是整数, 0 <= r < b. 输入 输入仅一行,包括两个双精度浮点数a和b. 输出 输出也仅一行,a÷b的余数 样例输入 73.263 0.9973 样例输出 0.4601 提示 注意:输出时小数尾部没有多余的0,可以用下面这种格式:double x;x =

浮点数类型转换的及其内存模型

先看一段测试code: void do_test() { unsigned int uValue = 0xC1480000; printf("uValue = %u,%d,%x,&uValue = %p\n",uValue,uValue,uValue,&uValue); float fValue1 = (float) uValue; printf("fValue1 = %f,&fValue1 = %p, *((unsinged int*)&fV

程序中关于浮点数计算的问题

在进行数值计算编程的过程中往往需要用到浮点数的计算,但浮点数的加减运算通常是会出现误差的.具体出现问题代码如下: double begin = 0.0; //起始位置 double end = 20.0;  //结束位置 int k = 2;  //核函数支持半径的倍数 double initialDis = 0.1;   //粒子间的初始距离(需要与粒子的控制体积保存一致性) /*****************第一步初始化粒子**********/ for(double i=begin-(2

第二章 Java浮点数精确计算

1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用BigDecimal. 2.代码 package com.xxx.util; import java.math.BigDecimal; /** * 浮点数精准算法 */ public class BigDecimalArithUtil { private static final int DIV_SCAL

js实现浮点数保留两位小数代码

js实现浮点数保留两位小数代码:过浮点数小数点后面的数字太长的话,可能需要进行截取操作,下面是一段这样的实例代码和大家分享一下.代码如下: var num=3.1415926; console.log(num.toFixed(2)) 以上代码比较简单,这里就多介绍了,具体可以参阅javascript的Number对象的toFixed()方法一章节. 原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=11735 更多内容可以参阅:h