mysql 工资 float_mysql的float类型很奇怪的

我有个表 test,里面有三个字段,

uid,one,two,uid是int类型,自增,one字段是float(3,2) two字段是float(5,2).

按照道理one字段我可以插入 123.12 这样的数字对吧,也就是前面三位,后面两位

two字段我可以插入前面5位,后面两位吧,但是我插入一条

insert into test values(null,123.12,12345.12) 插入成功了,但是显示的数据则不一样,这是为什么呢

如果我需要插入数值 98.12,即前面2位,小数点两位,这个字段是应该设置成float类型吗

回复讨论(解决方案)

1、你定义错了

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

2、有精度要求应使用

DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:

salary DECIMAL(5,2)

在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。

1、你定义错了

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

2、有精度要求应使用

DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:

salary DECIMAL(5,2)

在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。

恩,明白了,谢谢徐版,那比如货币存储的时候必须要正数,不能为负数,这里数据库里面可以直接来限制吗,还是通过PHP正则来限制。我试了可以直接插入负数,比如 -91.22 这样的值,mysql可以限制只能存储正数吗

一个字段 salary DECIMAL(5,2) 这样的一个字段插入的值,也就是最大位数是前面3位,后面2位,必须这样,比如插入 123.12就可以,如果插入123456这样的就不行,虽然也是5位,但是没有两位小数点后面的。

123456 保存在 DECIMAL(5,2) 就是 12345.00 当然就越界了

DECIMAL(5,2) 只能保存 -999.99 ~ 999.99

货币存储的时候必须要正数,这是什么道理

负数不行吗?表示欠款

要限制正数应该设置UNSIGNED属性。

建议用decimal字段表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值