结论:我们的选择是int 和 bigint ,以分为单位来存;

一个外国人的视频 讲解了,我直接按重点截图了,连接地址:【在MySQL中存储货币的正确方式:不要使用 float 或 double ,要用 decimal 或 integer/bigint !】https://www.bilibili.com/video/BV15N4y147YE?vd_source=025a1c967fa95b3dcfb9b276f7348163

我们对比下 decimal 和 int/bigint;先看下 若以分为单位 存储的金额范围:

MySQL类型 以分为单位取值范围 占用的字节
int -21474836.48元 --> 21474836.47 元 4
Bigint -92233720368547758.08 元 --> 92233720368547758.07 元 8

若要达到 同样的取值范围,我们看下 使用decimal的情况:

取值范围 需要的MySQL类型 字节
-21474836.48元 --> 21474836.47 元 decimal(10, 2) DECIMAL(10, 2)在MySQL 8中大概会占用6到8个字节或更多
-92233720368547758.08 元 --> 92233720368547758.07 元 decimal(19, 2) DECIMAL(19, 2)在MySQL 8中大概会占用更多的字节,可能是12到16个字节或更多

可见:

  1. 货币若用 decimal 在MySQL层面会占用 更多的字节;
  2. 货币若用decimal 还存在 MySQL 类型 --> Java类型---> delphi类型 转换的问题;比如 Java里只能使用BigDecimal,比较麻烦;

MySQL里的decimal对应Java和Delphi中的类型如下:

1. 在Java中:

  • MySQL的decimal对应Java中的BigDecimal类型。
  • 原因:BigDecimal在Java中用于表示任意精度的小数值,它使用BigInteger维护精度,在运算过程中不会丢失精度。这种特性使得BigDecimal非常适合与MySQL中的decimal类型相对应,因为两者都是用于存储精确的小数值。

2. 在Delphi中:

  • MySQL的decimal可以对应Delphi中的CurrencyVariant类型,但更常用的是使用第三方库或自定义记录类型来处理高精度的小数。
  • 说明:Delphi本身没有直接等同于Java中BigDecimal的类型,但可以使用Currency类型来处理固定小数点的高精度数值。如果需要更高的精度和灵活性,开发人员通常会使用如GNU MP Bignum Library(GMP)之类的库,或者定义一个自定义的记录类型来存储和处理大数值。

总的来说,由于不同编程语言和环境的差异,对于高精度小数的处理可能会有所不同。在Java中,BigDecimal是处理这类数值的理想选择,而在Delphi中,可能需要结合使用内置类型或第三方库来达到类似的功能。

image
image
float double 不精确
image
image
image
image
image
image
image
image

posted on 2024-04-24 12:18  del88  阅读(5)  评论(0编辑  收藏  举报