symfony form money type 为什么存到数据库 是价格乘以 100?

2021-12-29 12:56:59 +08:00
 zzzkkk

symfony form money type 为什么存到数据库 是价格乘以 100 ? 是 doctrine 缘故吗?

在数据库里的类型是 decimal(12,2)

页面里输入 2.22 form->getData() 得到 222

1905 次点击
所在节点    PHP
6 条回复
cpstar
2021-12-29 13:00:49 +08:00
难道不去数据库里看一下存的是 2.22 还是 222 么?如果是 222 ,那就是 getData 要做 cast ,如果是 2.22 ,还是 getData 做了错误的 cast 。
getData:所以就是怪我喽ㄟ(≧◇≦)ㄏ。
xumng123
2021-12-29 16:00:32 +08:00
钱不能用浮点数,必须化成整数
fkdog
2021-12-29 16:20:22 +08:00
浮点数做运算会出误差的。
0.3+0.3+0.3 算出来的结果是 0.89999999999.
强行四舍五入精度不够的话,容易产生误差,假设一笔误差 0.00001 ,一天上百万笔交易金额产生的误差就会以千万为单位。。一年下来就是好几百万了。
lap510200
2021-12-29 16:41:43 +08:00
@xumng123 数据库字段用的 decimal(12,2 )可以存浮点数,计算用高精计算,不一定非要存分
TonyG
2021-12-29 17:25:50 +08:00
老派规避浮点计算问题的做法,但很有效
zzzkkk
2021-12-30 15:12:32 +08:00
@fkdog

特地去数据库测试了下 原来的 order_total 是 decimal(12,2)
新增一个字段 total decimal(12,2)
update orders set total = order_total *100;

结果 sum 两个字段出来正好一样 无非是总数*100
+------------------+
| SUM(order_total) |
+------------------+
| 48461619.87020 |
+------------------+

+---------------+
| SUM(total) |
+---------------+
| 4846161987.02 |
+---------------+


259585 行数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX