Mysql将FLOAT转换为DECIMAL



我有mysql DB与重要的财务数据,目前数据存储为float类型,我得到不正确的数据由于浮点四舍五入,我想将其存储为DECIMAL。

在不改变现有数据的情况下转换DB中的数据的安全方法是什么?或者有其他解决这个问题的办法吗?

编辑:从FLOAT转换到VARCHAR,然后从VARCHAR转换到DECIMAL是一种安全的方式吗?

提前感谢!

13815500FLOAT中完全可表示。但你很接近安德鲁所说的——16777217是不完全可表征的;会差1欧元或1美元或其他什么。

如果没有小数位,则选择

  • FLOAT,在16,777,216以上混乱。
  • DECIMAL(9,0)可以处理多达10亿的数字。警告:如果你需要小数位,就说出来!_
  • INT峰值约为20亿。
  • INT UNSIGNED -限制约40亿(仅限非负值)。

上面提到的每个数据类型占用4个字节。除了最后一个,其他都允许负值。FLOAT将继续运行,但在底部丢失比特;其他的"溢出"。

其他选项:DECIMAL(m,0)较大的数字(m<=64), DOUBLE(大的浮点范围),BIGINT(大的整型范围);

语法是
ALTER TABLE tablename
    MODIFY col_name NEW_DATATYPE [NOT NULL];

(没有必要,而且可能是有害的,通过VARCHAR。)

一般规则:使用DECIMAL表示金钱,因为它是"精确的";使用FLOAT进行测量(如传感器、距离等)

如果最大值是13815500,那么DECIMAL(64,56)将保存您的任何数字,并处理小数点后56位。此外,您可以对这些数字进行基本的算术运算。注意:如果您将SUMming设置为1000个这样的数字,则在小数点之前需要额外的3位: DECIMAL(64,53)。对一百万个数字求和:DECIMAL(64,50) .

如果你的当前数据位于FLOAT列,那么你只有大约7位有效数字;其余的数字在存储时丢失了。你能恢复失去的精度吗?如果是这样,用合适的DECIMAL重新开始。如果不是,那么数值分析师会认为你最好还是坚持使用FLOATSUM仍然适用于大约6-7位有效数字。这对于大多数用途来说已经足够了。

你现在几乎掌握了MySQL和数值分析的所有知识;你决定做什么。

没有安全的方法。由于浮点数的工作原理,大于16777216(或小于-16777216)的32位浮点数需要是偶数,大于33554432(或小于-33554432)需要被4整除,大于67108864(或小于-67108864)需要被8整除,等等。

最新更新