我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

开发时遇到过这个问题,由于在数据库表中插入浮点型数据,导致查询不到相同的数字,比如14.9,当时为了让服务跑起来,直接在代码中减1。后来上网查了一下,发现在遇到float的精度问题时,即使指定为float(d,m) d:表示整数位数,m:表示小数点后位数,也还是会出现精度丢失问题,主要是四舍五入导致的。

为了解决这个问题,采用浮点数据来保存问题可以很好地解决精度问题。

以下是来自互联网的一个例子:

float 容易出错,当需要高精度时,建议使用它来存储,在 MySQL 内存中以字符串形式存储,用于定义精度较高的货币数据。在数据迁移中,float(M,D) 是非标准定义,最好不要使用。M 表示精度,D 表示小数位数。

mysql>表t1(c1浮点数(10,2),c3(10,2));

查询成功,0 行(0.02 秒)

mysql>进入t1(.23,.23);

查询成功,1 行(0.01 秒)

mysql>* 来自 t1;

+------------+------------+

| c1 | c3 |

+------------+------------+

| .25 | .23 |

+------------+------------+

一组 1 行 (0.02 秒)

mysql>进入t1(.21,.12);

查询成功,1 行(0.00 秒)

mysql>

mysql>* 来自 t1;

+------------+------------+

| c1 | c3 |

+------------+------------+

| .25 | .23 |

| .00 | .12 |

+------------+------------+

共 2 行 (0.00 秒)

当 fload 的精度和小数位数未定义时,数据将根据给定的值进行存储,这取决于操作系统和当前硬件。

默认为 (10,0)

因为存在错误问题,所以在程序中,最好使用浮点数进行比较,不要使用范围比较。如果要比较数值,最好使用类型。

精度中不包含符号:

mysql>进入t1(-.21,-.12);

查询成功,1 行(0.01 秒)

mysql>* 来自 t1;

+--------------+--------------+

| c1 | c3 |

+--------------+--------------+

| .25 | .23 |

| .00 | .12 |

| -.00 | -.12 |

+--------------+--------------+

共 3 行 (0.00 秒)

float 占用 4 个字节,(M,D) 占用 8 个字节,(M,D) 占用 M+2 个字节。

这里要补充一点,数据库中一般都是用int和float类型,很少用到。而且在插入数据库的时候,不同的浮点数插入到数据库的方式不一样,比如14.9插入到数据库就是14.90000,而62.1插入到数据库就是62。最好在SQL语句中将变量从float类型改为float类型,也就是%f---》%s,这个问题就解决了。

另外,如果浮点数据存在精度问题,只需减去0.01就可以很好地解决问题,而无需使用数据类型。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/2932.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线