会员中心的积分和金额字段,为什么设计成整型的。不应该是小数类型吗。

不明白,会员中心的积分和金额字段,为什么设计成整型的。不应该是小数类型吗。
二次开发时,才发现这问题的。money score字段都是int类型的。 建议改为decimal类型吧,方便记录元角分或后期开发分销分红占百分比等业务。

5个回答默认排序 投票数排序
叶开
叶开
这家伙很懒,什么也没写~
8月前

-- Table structure for ba_user_score_log


DROP TABLE IF EXISTS ba_user_score_log;
CREATE TABLE ba_user_score_log (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
user_id int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '会员ID',
score decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更积分',
before decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更前积分',
after decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更后积分',
memo varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '备注',
create_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员积分变动表' ROW_FORMAT = Dynamic;


-- Table structure for ba_user_money_log


DROP TABLE IF EXISTS ba_user_money_log;
CREATE TABLE ba_user_money_log (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
user_id int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '会员ID',
money decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更余额',
before decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更前余额',
after decimal(18, 2) NOT NULL DEFAULT 0.00 COMMENT '变更后余额',
memo varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '备注',
create_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员余额变动表' ROW_FORMAT = Dynamic;


-- Table structure for ba_user


DROP TABLE IF EXISTS ba_user;
CREATE TABLE ba_user (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
group_id int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分组ID',
username varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户名',
nickname varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '昵称',
email varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮箱',
mobile varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机',
avatar varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '头像',
gender tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '性别:0=未知,1=男,2=女',
birthday date DEFAULT NULL COMMENT '生日',
money decimal(18, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '余额',
score decimal(18, 2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '积分',
last_login_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '上次登录时间',
last_login_ip varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '上次登录IP',
login_failure tinyint(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录失败次数',
join_ip varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '加入IP',
join_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '加入时间',
motto varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '签名',
password varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
salt varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码盐',
status varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '状态',
update_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '更新时间',
create_time bigint(16) UNSIGNED DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX username(username) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '会员表' ROW_FORMAT = Dynamic;

妙码生花
妙码生花
这家伙很懒,什么也没写~
8月前

片面了

小满
小满
和靠谱的人一起做靠谱的事!
8月前

积分字段设置为整数,余额字段可以是小数

业余程序员-老陈
业余程序员-老陈
这家伙很懒,什么也没写~
8月前

数据库设置的decimal取到php里面就成浮点数了,只要你计算或者比较肯定会出问题。
我是这么做的数据库存成收整数以分为单位,使用的时候除以100,存的时候乘以100,只要计算或者比较都使用原始的整数

叶开
叶开回复业余程序员-老陈
这家伙很懒,什么也没写~
8月前

decimal取到php里面就成浮点数 php里比较没问题的。现在php8还有强类型呢。

除以100这个是不可取的,(1)个问题是int本身就11位。不够用啊。在有符号类型下,INT类型最大值为2147483647,即2的31次方减一; 假如要保留4位小数吧 214748.3647 才21万。金额是100万 1000万 1个亿怎么办?
(2) 写程序容易忘记除100,或重复几次除100。

业余程序员-老陈
业余程序员-老陈回复叶开
这家伙很懒,什么也没写~
8月前

1.强类型也不能拿浮点数做计算和比较
2.模型里面获取器里除100,修改器里乘100. 计算比较的时候使用getData()获取原始值。
3.转账不可能转0.01以下的,所以一般不会有4位小数的场景,bigint应该是够用的。但凡涉及金额处理个人觉得不要嫌麻烦。

我只是说点自己的理解也不是最优解,你自己使用顺手就行。

平稳稳
平稳稳
一点点
2月前

等你遇到的时候会哭的!所有数SUM就不等于预期数,每个数的还都对,用计算器按一遍也没毛病。

请先登录
0
1
0
7