我正在计算某些东西的费用(货币),当数量为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 Math和GMP.但是,使用这些似乎有点矫枉过正.使用BC,您可以这样做:
bcsub(bcadd(bcadd('96.54','0.25',2),'3.20',2),'99.99',2) = 0
请注意,您还必须在此处指定小数点数(2).
一般来说,使用浮点数和双倍用于财务是不受欢迎的,但使用PHP它似乎更简单的选项.我建议您使用round()将数字四舍五入到输入的小数位数.
round(96.54 + .25 + 3.20 - 99.99,2) = 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。