Home > Backend Development > PHP Tutorial > mysql的float类型很奇怪的

mysql的float类型很奇怪的

WBOY
Release: 2016-06-23 13:55:50
Original
719 people have browsed it

我有个表 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字段表示

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template