数据库字段是decimal(7,2),后端插入时怎么对金额处理稳妥不会出错?

$money = 1500.668;
var_dump(sprintf("%.2f", $money)); //string(7) "1500.67"
var_dump(round($money,2)); //float(1500.67)

我所知道的这两种,不知哪种好,还有没有最稳妥的处理方法

welcome come back
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6
自由与温暖是遥不可及的梦想
floatval(bcadd($number, 0, 2))
4年前 评论
自由与温暖是遥不可及的梦想
floatval(bcadd($number, 0, 2))
4年前 评论

2种四舍五入的处理方式不同,sprintf("%.2f", $money)这种方式四舍六入五成双,建议转化为整数四舍五入再转化为小数

4年前 评论
Mumujin

建议金额存到6位。

floatval(bcsub((string)$userBalance, (string) $amount, 6))
4年前 评论

如果你需要四舍五入,直接就往里面存就好了,decimal存的小数位数超出设定的小数位数,会自动进行四舍五入,不需要的话,小数需要精度运算

4年前 评论

你的金额这么小的吗?只需要 7 位? :grin:

4年前 评论
php_yt (楼主) 4年前

建议第一种或者使用 bc 库,因为 string 是最保险的数据类型,另外,其实最好可以模仿微信、支付宝,使用分做单位,用整数保存,会减少小数出现的计算与金额分割问题

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!