您当前的位置: 首页 >  Java

liaowenxiong

暂无认证

  • 3浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java程序和MySQL数据库中关于小数的保存问题

liaowenxiong 发布时间:2021-09-17 14:57:43 ,浏览量:3

文章目录
  • MySQL 中的小数类型
    • decimal
    • double
    • float
  • Java 中的小数类型
    • float
    • double
    • BigDecimal
  • 金额的计算

MySQL 中的小数类型 decimal

MySQL 使用 decimal 保存高精度的小数,可以设置保留的小数个数。decimal(m,d),表示该值一共显示 m 位整数,其中 d 位位于小数点后面。

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

salary decimal(5,2)

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

在标准SQL中,语法 decimal(m) 等价于 decimal(m,0)。同样,语法 decimal 等价于 decimal(m,0),可以通过计算确定 m 的值。在MySQL 5.1中支持 decimalnumeric 数据类型的变量形式。m 默认值是 10

decimalnumeric 的最大位数是 65,但具体的 decimalnumeric 列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。

注:当对 decimal 类型的数据进行运算操作时,如果数值溢出会报错。

double
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

float 类型用于表示近似数值数据类型。SQL 标准允许在关键字 float 后面的括号内选择用位指定精度(但不能为指数范围)。0 到 23 的精度对应 float 列的 4 字节单精度。

例如,定义为 float(7,4) 的一个列可以显示为 -999.9999。MySQL 保存值时进行四舍五入,因此如果在 float(7,4) 列内插入 999.00009,近似结果是 999.0001

注:float 数据在运算时,如果数字溢出不会报错,会有精度的损失。

Java 中的小数类型 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 分,再进行计算,计算后再转换成元

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0447s