【讨论】浮点数的有效长度

[复制链接]
查看11 | 回复9 | 2010-3-1 11:19:07 | 显示全部楼层 |阅读模式
我知道float应该是7位有效长度,Double应该是16位有效长度
可是我插入26.123456789123456789,结果是26.1234567891235
怎么才15位有效长度呢?


回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
原帖由 fan0124 于 2010-11-16 10:45 发表
我知道float应该是7位有效长度,Double应该是16位有效长度
可是我插入26.123456789123456789,结果是26.1234567891235
怎么才15位有效长度呢?



你的插入字段到底是float还是double类型的?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
MySQL permits a nonstandard syntax: FLOAT(M,D) or REAL(M,D) or DOUBLE PRECISION(M,D). Here, “(M,D)” means than values can be stored with up to M digits in total, of which D digits may be after the decimal point. For example, a column defined as FLOAT(7,4) will look like -999.9999 when displayed. MySQL performs rounding when storing values, so if you insert 999.00009 into a FLOAT(7,4) column, the approximate result is 999.0001.
兄弟,你自己看看,把你的建表sql与insert sql贴出来,再讨论吧,你给的信息太少了一点。
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
原帖由 oraclemch 于 2010-11-16 10:58 发表
MySQL permits a nonstandard syntax: FLOAT(M,D) or REAL(M,D) or DOUBLE PRECISION(M,D). Here, “(M,D)” means than values can be stored with up to M digits in total, of which D digits may be after the decimal point. For example, a column defined as FLOAT(7,4) will look like -999.9999 when displayed. MySQL performs rounding when storing values, so if you insert 999.00009 into a FLOAT(7,4) column, the approximate result is 999.0001.
兄弟,你自己看看,把你的建表sql与insert sql贴出来,再讨论吧,你给的信息太少了一点。


MySQL的英文手册我看了的
建表
CREATE TABLE `test_data` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`test_id` double(30,18) unsigned DEFAULT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

实验1:

insert into test_data(test_id) values(0.123456789123456789);
在第三方软件中看是不一样的
MySQL-Front中显示为0.123456789123456800
SQLyog中显示为
0.123456789123456784


究竟哪个是准确的,是不是MySQL-Front中显示的是对的,16位有效数字?怎么结果还不一样,晕死

实验2:

insert into test_data(test_id) values(263.123456789123456789);
在第三方软件中看是不一样的
MySQL-Front中显示为263.123456789123456000
SQLyog中显示为
263.123456789123451927

实验3:
将test_id类型改为 double unsigned default null
INSERT INTO test_data(test_id) VALUES(0.123456789123456789);
MySQL-Front中显示为0.1234567891234569920000000000000
SQLyog中显示为
0.123456789123457

实验4:
test_id 类型仍为 double unsigned default null
INSERT INTO test_data(test_id) VALUES(263.123456789123456789);
MySQL-Front中显示为263.1234567891230080000000000000000
SQLyog中显示为
263.123456789123

以上实验,我感觉怎么Double类型的有效数字不止16位?而且怎么显示的都不一样呢
在不同的插入情况下
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
插入的Double类型的
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
楼上的,你从哪里看出 double的存储时16位呢?只有16个数字字符串呢?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
因为double的指数位只有16位,所以它能存储的有效长度为16位
我说的是有效长度,存储肯定是8字节
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
但是我实验后发现怎么显示的结果和有效长度16位有出入
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
浮点运算本身就是有误差的,
想要精确使用DECIMAL类型,要多少就是多少。
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
nice
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行