V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jss
V2EX  ›  PHP

PHP 一定要做精确计算吗?

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

    如果你是搞金融的那就 单位用基点好了
    hlwjia
        22
    hlwjia  
       2018-11-23 16:37:45 +08:00
    哎,就这样的水平也去写交易系统?

    这个是类似基本常识了(还是大家都不知道?
    jswh
        23
    jswh  
       2018-11-23 16:51:03 +08:00
    用整数,不是整数的想办法弄成整数
    sundev
        24
    sundev  
       2018-11-23 17:02:43 +08:00
    @skdyk @hlwjia 以前写过一套供方系统,有些公司采购的小零件单价都比较低的,很多都需要精确到小数点后 3 位!
    realpg
        25
    realpg  
       2018-11-23 17:22:16 +08:00
    int 不是为了精度啥的问题 还有性能问题
    realpg
        26
    realpg  
       2018-11-23 17:23:49 +08:00
    @sundev #18
    64bit 下 int 的最大值有 20 个数字的长度 自己定义 1 代表多少即可
    数据库内也有对应的 bigint 实现
    holystrike
        27
    holystrike  
       2018-11-23 17:28:47 +08:00
    q6014080325
        28
    q6014080325  
       2018-11-23 17:39:07 +08:00
    jules304
        29
    jules304  
       2018-11-23 18:04:52 +08:00
    BC 函数+1
    MeteorCat
        30
    MeteorCat  
       2018-11-23 18:07:47 +08:00 via Android
    bcmath
    solaro
        31
    solaro  
       2018-11-28 14:13:49 +08:00
    @onion83 这个坑我踩过,int 都不要用,一定要用 longint
    Snail233
        32
    Snail233  
       2018-12-05 12:37:38 +08:00
    bcadd()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1411 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:30 · PVG 01:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.