jss
V2EX  ›  PHP

PHP 一定要做精确计算吗?

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

    如果你是搞金融的那就 单位用基点好了
    hlwjia
    hlwjia
    Nov 23, 2018
    22
    哎,就这样的水平也去写交易系统?

    这个是类似基本常识了(还是大家都不知道?
    jswh
    jswh
    Nov 23, 2018
    23
    用整数,不是整数的想办法弄成整数
    sundev
    sundev
    Nov 23, 2018
    24
    @skdyk @hlwjia 以前写过一套供方系统,有些公司采购的小零件单价都比较低的,很多都需要精确到小数点后 3 位!
    realpg
    realpg
    Nov 23, 2018
    25
    int 不是为了精度啥的问题 还有性能问题
    realpg
    realpg
    Nov 23, 2018
    26
    @sundev #18
    64bit 下 int 的最大值有 20 个数字的长度 自己定义 1 代表多少即可
    数据库内也有对应的 bigint 实现
    q6014080325
    q6014080325
    Nov 23, 2018
    28
    jules304
    jules304
    Nov 23, 2018
    29
    BC 函数+1
    MeteorCat
    MeteorCat
    Nov 23, 2018 via Android
    30
    bcmath
    solaro
    solaro
    Nov 28, 2018
    31
    @onion83 这个坑我踩过,int 都不要用,一定要用 longint
    Snail233
    Snail233
    Dec 5, 2018
    32
    bcadd()
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1490 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 09:55 · PVG 17:55 · LAX 01:55 · JFK 04:55
    ♥ Do have faith in what you're doing.