- MySQL 中的小数类型
- decimal
- double
- float
- Java 中的小数类型
- float
- double
- BigDecimal
- 金额的计算
MySQL 使用 decimal
保存高精度的小数,可以设置保留的小数个数。decimal(m,d)
,表示该值一共显示 m
位整数,其中 d
位位于小数点后面。
decimal
和 numeric
类型在 MySQL 中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度。 例如:
salary decimal(5,2)
在该例子中,5
是精度,2
是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。
在标准SQL中,语法 decimal(m)
等价于 decimal(m,0)
。同样,语法 decimal
等价于 decimal(m,0)
,可以通过计算确定 m
的值。在MySQL 5.1中支持 decimal
和 numeric
数据类型的变量形式。m
默认值是 10
。
decimal
或 numeric
的最大位数是 65
,但具体的 decimal
或 numeric
列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。
注:当对 decimal
类型的数据进行运算操作时,如果数值溢出会报错。
salary double(7,4)
在该例子中,7
是精度,4
是标度,精度范围是 24~53
。
MySQL 将 double
视为 double precision
(非标准扩展)的同义词。MySQL 还将 real
视为 double precision
(非标准扩展)的同义词,除非 SQL服务器模式包括 REAL_AS_float 选项。
为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用 float 或 double precision
,不规定精度或位数。
注:double
数据在运算时,如果数字溢出不会报错,会有精度的损失。
float
类型用于表示近似数值数据类型。SQL 标准允许在关键字 float
后面的括号内选择用位指定精度(但不能为指数范围)。0 到 23 的精度对应 float 列的 4 字节单精度。
例如,定义为 float(7,4)
的一个列可以显示为 -999.9999
。MySQL 保存值时进行四舍五入,因此如果在 float(7,4)
列内插入 999.00009
,近似结果是 999.0001
。
注:float
数据在运算时,如果数字溢出不会报错,会有精度的损失。
单精度浮点型,含字节数为 4,32bit,差不多 7 个有效位,整数部分最多 7 位,小数部分最多 7 位,取值范围太小,几乎没有用
double双精度浮点数,含字节数为 8,64bit,差不多 15 个有效位,整数部分最多 15 位,小数部分最多 15 位,基本够用,计算金钱可以达到 1 亿亿以内的范围。
BigDecimal比较大的小数只能使用 BigDecimal 来接收,MySQL 数据库 decimal 可以保存最多 65 位的小数,但是 double 只能接收差不多 15 位的小数。
数据库获取到数据需要转换成字符串类型,然后再使用 BigDecimal(String) 构造器将数值封装成一个 BigDecimal 对象。
金额的计算金额需要转成最小单位,例如,1.24 元,需要转换成 124 分,再进行计算,计算后再转换成元