PHP浮点数运算

金额计算必需注意此问题!

目录

问题:浮点数的加减乘除

$num = 7.1 - 7.0;

$num2 = $num - 0.1;

var_dump($num2 == 0); //false

$num2 == 0 返回false,与我们预期的不一致!

解决方法

1、BCMath

使用PHP PECL中的 BC Math 模块来进行浮点运算,确保运算结果正确!

示例

浮点数比较

echo bccomp(‘1‘, ‘2‘) . "\n"; // -1

echo bccomp(‘1.00001‘, ‘1‘, 3); // 0

echo bccomp(‘1.00001‘, ‘1‘, 5); // 1 

时间: 2024-11-03 22:28:58

PHP浮点数运算的相关文章

【javascript】浮点数运算问题分析及解决方法

问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的数字都是以 IEEE-754 标准格式表示的.浮点数的精度问题并不是 js 特有的,因为有些小数以二进制表示位数是无穷的,比如 1.1,其程序实际上无法真正的表示 1.1,而只能做到一定程度上的准确(1.09999999999999999),这是无法避免的精度丢失. 通过 chrome 控制台,我们

程序员必知之浮点数运算原理详解

导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握.许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题. 许多人使用float/double进行货币计算时经常会犯错.这篇文章是这一系列中的精华,所有的软件开发人员都应该读一下. 随着你经验的增长,你肯定 想去深入了解一些常见的东西的细节,浮点数运算就是其中之一. 1. 什么是浮点数? 在计算机系统的发展过程中,曾经提出过多种方法表达实数. [1]典型的比如相对于浮点数的定点数(Fixed Point Num

记C语言浮点数运算处理 "坑" 一则

看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; int i = (int)(x*10); return 0; } 在你心目中, 变量 I 是怎样的结果? 如果你理所当然地认为是3的话, 那么你就错了~~~ 实际结果应该是2.   为什么? 简而言之, x在内存的值并不是精确的1.3, 实际上可能是1.29999999...... 因为在计算机组成原因中有说过, 浮点数无法被准确地表示出来, 只能是一个非常精确的值.. 就算现在你已经知

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变

【转】javascript 浮点数运算问题

大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13); 结果居然是592.800000000001,当然加法之类的也会有这个问题 那这是js的错误吗? 当然不是,你的电脑做着正确的二进制浮点运算,但问题是你输入的是十进制的数,电脑以二进制运算,这两者并不是总是转化那么好的,有时候会得到正确的结果,但有时候就不那么幸运了 alert(0.7+0.1);//输出0.7999999999999999 alert(0.6+0.2);//输出0

高精度浮点数运算

/* Name: 高精度浮点数运算 Copyright: Author: 巧若拙 Date: 08-11-14 10:17 Description: 本程序实现了高精度浮点数的加法,减法,乘法,乘方和除法运算,有效数字精确到MAX. 为了便于进位,本程序采用了较为独特的数据结构,即把浮点数分成整数和小数部分,分别存储在两个不同的数组中. 其中整数部分数字存储在ValInt[MAX-lenInt...MAX) ,小数部分数字存储在ValDec[1...lenDec],ValDec[0]用来存储进位

由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入

public class Arith { /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * 提供精确的加法运算. * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ p

工具类---提供精确的浮点数运算

import java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对浮点数进行运算, 这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ public class Arith { // 默认除法运算精度.除法的时候,默认的精确到小数点后10位 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * 提供精确的加法运算. * * @par

PHP浮点数运算精度造成的,订单金额支付经常少1分的问题

最近碰见一个奇怪的问题,商城通过微信支付的订单经常少一分钱,经过排查是PHP浮点运算精度问题造成的 由PHP浮点数运算精度造成的,鸟哥的Bolg有详细的说明.http://www.laruence.com/2013/03/26/2884.html, 小数在二进制表示时,0.58对于二进制,是无限长的值 0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111 0.57的二进制表示基本上(52位)是: 001

浮点数的输入以及浮点数运算

写在前面 上一次我们讲解了IEEE的标准,还记得多少? 之前我提到过,有很多小数是二进制浮点数无法表示的,因此就难免会遇到舍入的问题.这一点其实在我们平时的计算当中会经常出现,就比如我们之前提到过的0.3,就无法使用浮点小数来准确表示. 我使用C#写了一个程序,打印出0.3的二进制表示,是这样的一个数字:0 01111101 00110011001100110011010.不信没关系,用我昨天说的那个公式计算一下啊.这个二进制数大概是多少,它的阶码在偏置之后的值为-2,它的尾数位在加1之后为1+