You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Square iOS Web API交易时含0.99金额触发amount_invalid_format错误

解决Square iOS Web API金额含0.99时的amount_invalid_format错误

我之前帮开发者排查过完全相同的Square POS交易问题,你遇到的这个amount_invalid_format错误,核心原因是Square API对金额的格式要求是「以分为单位的整数」,而非带小数的美元数值,尤其是.99结尾的金额容易触发浮点数精度问题,导致API判定格式无效。

为什么会出现这个问题?

当你直接传入1.99或20.99这类小数金额时,浮点数的精度缺陷会让实际计算出的分数值出现偏差——比如1.99 * 100在代码中可能得到198.99999999999997而非精确的199,Square API收到这个非整数的金额参数后,就会返回amount_invalid_format错误。

解决方案(分步操作)

  • 第一步:用精确的十进制运算转换金额单位
    放弃浮点数运算,改用十进制类型(Swift的Decimal、Objective-C的NSDecimalNumber)把美元金额转换为分的整数:

    // Swift示例:将美元金额字符串转换为分的整数
    let dollarAmount = "20.99"
    guard let amountDecimal = Decimal(string: dollarAmount) else {
        // 处理无效输入
        return
    }
    let centsAmount = (amountDecimal * 100).rounded()
    // 将Decimal转换为Int,作为API请求的金额参数
    let amountParam = (centsAmount as NSDecimalNumber).intValue
    

    这样能完美避免浮点数精度问题,确保20.99美元被精确转换为2099分。

  • 第二步:确保请求参数为整数类型
    在构造Square Web API的请求体时,amount_money中的amount字段必须是整数(或字符串形式的整数),不能是浮点数。正确的请求体示例:

    {
      "amount_money": {
        "amount": 199,
        "currency": "USD"
      },
      // 其他交易参数...
    }
    
  • 第三步:校验用户输入(如果有)
    如果金额来自用户输入,先做格式校验:确保输入是合法的美元金额(最多两位小数),再进行单位转换,避免非法格式传入API。

额外注意事项

  • 永远不要用浮点数处理货币计算,精度误差是这类问题的重灾区,十进制类型才是处理金额的正确选择。
  • 测试时可以直接传入199、2099这类整数金额,验证是否能正常发起交易,排除其他潜在问题。

内容的提问来源于stack exchange,提问作者Manthan Desai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:19:56