php正整数金额统计,涉及到金额的为什么都要保存整数?

浮点数在PHP中由于二进制表示的限制,可能导致精度丢失,造成计算错误。对于需要高精度计算的场景,如账户余额,应避免使用float和double。推荐使用bcmath或GMP库进行任意精度数学计算,并存储为decimal类型以确保精度。例如,decimal类型在MySQL中可用于存储如账户余额这类需要精确值的数据,避免误差。在PHP中,可以利用bcmath函数进行加减乘除等操作,确保计算无误。
摘要由CSDN通过智能技术生成

浮点数的精度:

http://php.net/manual/zh/language.types.float.php

以十进制能够精确表示的有理数如0.1或0.7,无论有多少尾数都不能被内部所使用的二进制精确表示.

因此不能在不丢失一点点精度的情况下转换为二进制的格式.

这就会造成混乱的结果,例如 floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8.

因为该结果内部的表示其实是类似 7.9999999999999991118...

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

如果确实需要更高的精度,应该使用bcmath(Binary Calculator Math)函数或者gmp(GNU Multiple Precision)函数.

http://php.net/manual/zh/ref.bc.php

http://php.net/manual/zh/ref.gmp.php

为了保险起见,我们应该使用字符串来保存大整数,并且采用比如bcmath这样的数学函数库来进行计算.

比如用PHP对账户余额进行计算时,可以使用bcmath系列任意精度数学计算函数.

加 bcadd

减 bcsub

乘 bcmul

除 bcdiv

乘方 bcpow

开平方根 bcsqrt

比较 bccomp

取模(求余数) bcmod

var_dump((0.5+0.2+0.3)==1); // bool(true)

var_dump((0.5+0.2+0.2+0.1)==1); // bool(false)

echo bccomp('1.01', '1', 1); // 保留1位小数,此时1.01等于1.返回0,表示两个数相等.

echo bccomp('1.01', '1', 2); // 保留2位小数,此时1.01大于1.返回1,表示左边的数比右边大.

浮点数存在精度的问题,数据库字段采用float和double型都容易产生误差.

如果存储对精度要求比较高的数据,比如账户余额,就不能使用float型了,这时应该使用decimal型.

比如我们将MySQL数据库字段"账户余额"的数据类型定义为decimal(5,2),这样就可以存放-999.99到999.99范围内的数,并且不会出现误差.括号里左边的数表示总有效位数,右边的数表示小数位数.如果范围不够用,可以定义为decimal(10,2).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值