结论:我们的选择是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个字节或更多 |
可见:
- 货币若用 decimal 在MySQL层面会占用 更多的字节;
- 货币若用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中的Currency
或Variant
类型,但更常用的是使用第三方库或自定义记录类型来处理高精度的小数。 - 说明:Delphi本身没有直接等同于Java中
BigDecimal
的类型,但可以使用Currency
类型来处理固定小数点的高精度数值。如果需要更高的精度和灵活性,开发人员通常会使用如GNU MP Bignum Library
(GMP)之类的库,或者定义一个自定义的记录类型来存储和处理大数值。
总的来说,由于不同编程语言和环境的差异,对于高精度小数的处理可能会有所不同。在Java中,BigDecimal
是处理这类数值的理想选择,而在Delphi中,可能需要结合使用内置类型或第三方库来达到类似的功能。
float double 不精确
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18155013