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

PHP 一定要做精确计算吗?

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

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

    这个是类似基本常识了(还是大家都不知道?
        23
    jswh   86 天前
    用整数,不是整数的想办法弄成整数
        24
    sundev   86 天前
    @skdyk @hlwjia 以前写过一套供方系统,有些公司采购的小零件单价都比较低的,很多都需要精确到小数点后 3 位!
        25
    realpg   86 天前
    int 不是为了精度啥的问题 还有性能问题
        26
    realpg   86 天前
    @sundev #18
    64bit 下 int 的最大值有 20 个数字的长度 自己定义 1 代表多少即可
    数据库内也有对应的 bigint 实现
        28
    q6014080325   86 天前
        29
    jules304   86 天前
    BC 函数+1
        30
    MeteorCat   86 天前 via Android
    bcmath
        31
    solaro   81 天前
    @onion83 这个坑我踩过,int 都不要用,一定要用 longint
        32
    Snail233   74 天前
    bcadd()
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   993 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 18:03 · PVG 02:03 · LAX 10:03 · JFK 13:03
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1