PHP奇怪地减去数字-返回长浮点值

PHP奇怪地减去数字-返回长浮点值,php,Php,我正在计算某些东西的费用(货币),当金额应该是0.00时,PHP的行为异常。它以浮点数的形式给出最终结果,而不是应该是0 在我的数据库中,我有下表 id | transaction_total | charge_fees | deposit_fee | amount_to_customer | fees_minus_total_difference 因此,当我去检查以确保费用+支付金额-总计=0.00 (96.54 + .25 + 3.20 - 99.99

我正在计算某些东西的费用(货币),当金额应该是0.00时,PHP的行为异常。它以浮点数的形式给出最终结果,而不是应该是0

在我的数据库中,我有下表

id   |  transaction_total   |    charge_fees   |  deposit_fee   |   amount_to_customer   |   fees_minus_total_difference
因此,当我去检查以确保费用+支付金额-总计=0.00

(96.54 + .25 + 3.20 - 99.99) = 1.4210854715202E-14
为什么结果是一个浮点数而不是零?这些数字最初是更多的小数位数,但我使用number_格式将其设置为2位。例如,收费实际可能是3.19987

number_format(3.19971,2,'.','')  //equals 3.20

当我将其保存到数据库中时,它显示为3.20。当我在计算总额/费用检查时使用它,结果不是零,尽管很接近

我建议不要使用
number\u format()
来显示字符串。改用
round()

你的问题是浮点数。PHP具有更精确的数学函数,您可以查看这些函数,如bcadd、bcmul、bcdiv等


计算机以二进制存储数字,因此当您试图表示十进制数字时,可能会失去精度。这就是这里正在发生的事情

有些语言有精确的类型,但不幸的是,PHP没有。不过,它确实为您提供了和。不过,在这里使用这些似乎有些过头了。使用BC,您可以执行以下操作:

bcsub(bcadd(bcadd('96.54','0.25',2),'3.20',2),'99.99',2) = 0
请注意,您还必须在此处指定小数点(2)的数量

一般来说,不赞成使用float和double进行财务处理,但使用PHP似乎更简单。我建议您使用
round()
将数字四舍五入到输入的小数位数

round(96.54 + .25 + 3.20 - 99.99,2) = 0

除非你不介意损失少量的钱(或者可能获得一些钱),否则千万不要用浮点来表示货币价值。可以用美分计算,也可以用任意精度的库(如bcmath)计算。可能的重复项需要将数字作为字符串提供给bc函数。仅仅在源代码中写入
0.12345
,已经使您失去了准确性。它应该是
bcadd('1.234','5.678')