PHP 一定要做精确计算吗?

2018-11-23 11:29:26 +08:00
 jss
项目一直有金额误差,如:floor((39.89 - 39.88) * 100) /100 = 0 ;大家是如何处理 php 计算的?
5565 次点击
所在节点    PHP
32 条回复
Jaylee
2018-11-23 11:37:12 +08:00
bcmatch
onion83
2018-11-23 11:37:37 +08:00
计费项目,请使用分,字段类型为 int
Jaylee
2018-11-23 11:38:24 +08:00
@Jaylee typo => bcmath
mayday526
2018-11-23 11:40:03 +08:00
直接这样不行吗.....round((39.89 - 39.88),2)
lockiee
2018-11-23 11:43:01 +08:00
bcmath +1
4pmBaoZi
2018-11-23 12:03:15 +08:00
浮点数运算都会有误差,这是都存在的问题。特别涉及金钱,必须的精确计算,钱多了客户不找你,钱少了分分钟找你拼命。不理解的话,Laruence 大神的这遍博客看一下 http://www.laruence.com/2013/03/26/2884.html
Joyboo
2018-11-23 12:23:12 +08:00
用分做单位
maichael
2018-11-23 12:25:41 +08:00
看需求,不一样的需求对精度要求不一致。
buhi
2018-11-23 12:44:26 +08:00
浮点数算钱, 亏起来一天能亏个几百上千
947211232
2018-11-23 12:46:12 +08:00
PHP 的自动类型转换的一个例子是乘法运算符“*”。如果任何一个操作数是 float,则所有的操作数都被当成 float,结果也是 float。否则操作数会被解释为 integer,结果也是 integer。注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。
947211232
2018-11-23 12:46:26 +08:00
thinkwei2012
2018-11-23 12:57:45 +08:00
bcmath+1
sunmonster
2018-11-23 13:10:07 +08:00
gabezhao
2018-11-23 13:36:49 +08:00
bcmath+1 需要的,做 erp 报表之类的需要精确计算,要不然数据不准确
NEETLEE
2018-11-23 14:00:35 +08:00
上个星期我们的支付业务也遇到这个 bug,头痛了一个星期。
最终方案是需要把浮点型转整型的时候先把浮点数转成字符串再转整型,就不会丢失精度了
xxbutoo
2018-11-23 14:14:31 +08:00
你可能需要翻翻 php 文档..
金额相关的还是用分为单位吧。 存 float 遇到坑你就后悔了
msg7086
2018-11-23 14:43:37 +08:00
金额用浮点这种近似数值简直是做大死。
sundev
2018-11-23 14:50:37 +08:00
@xxbutoo 单价这类的数据你们数据库里面怎么保存?如果分的话,单价比较小的不是没法保存了?
yogogo
2018-11-23 16:13:57 +08:00
@sundev decimal
skdyk
2018-11-23 16:33:05 +08:00
@sundev 你们的单价比 0.01 还要低吗?单价最低一般也是 0.01 吧,用分表示,在数据库里存 1 就好了呗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX