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


PHP subtracting numbers strangely - returning long float values

我正在计算一些东西的费用(货币),当金额应该是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_format将其放入2位。例如,收费实际可能为3.19987

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

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

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

有些语言有精确的精度类型,但不幸的是PHP没有。不过,它确实为您提供了BC数学和GMP。不过,在这里使用这些似乎有些过头了。使用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

我建议除了显示字符串之外,不要使用number_format()。请改用round()

你的问题是浮点数。PHP有更准确的数学函数,你可以看看像bcadd,bcmul,bcdiv等…

http://php.net/manual/en/book.bc.php