我使用MySQL的C api来确定可以存储在特定字段中的最大可能值。
我有下表:
CREATE TABLE test (
f1 double(4,2),
f2 double
)当我使用API获取f1和f2的字段信息时,我看到了以下内容:
f1:{ [...], length = 4, decimals = 2 }
f2:{ [...], length = 22, decimals = 31 }
据我所知,f1可以存储的最大值是99.99 (总长度= 4,所以4-2=小数点之前的2位,小数之后的2位)。
如果一个列类型是DOUBLE,那么它的长度是22,它的十进制是31,那么没有指定(m, d),这是安全的吗?如果是这样的话,那么我们还可以假设这个列可以存储的最大值是1.7976931348623157E+308 (按照文档)吗?这个值会在不同的机器/操作系统之间发生变化吗?
发布于 2019-06-23 05:36:51
不要在FLOAT或DOUBLE上使用(m,n)。它实际上是无用的,并导致双圆。
DOUBLE是IEEE-754的“双”,它包含53个重要比特和一个范围,在给定的数字上(超过1.E+308)达到最高值。这对几乎所有语言和机器都是通用的。
今天,几乎没有任何机器/操作系统在表示数字方面偏离IEEE754。从理论上讲,你可以看到不同之处,但我怀疑你会看到。
information_schema.COLUMNS.numeric_precision中的"22“可能来自它需要显示多少字符(但即便如此也没有意义)。我不知道你从哪得到"31“的。
https://dba.stackexchange.com/questions/241195
复制相似问题