我有mysql与重要的财务数据,目前数据存储为浮点数类型,我得到的不正确的数据,因为浮动四舍五入,我想把它存储为十进制。
在不更改现有数据的情况下,如何安全地转换DB中的数据?或者其他解决这个问题的办法?
编辑:从浮点转换到VARCHAR和从VARCHAR转换到十进制是一种安全的方法吗?
提前感谢!
发布于 2022-11-06 23:34:38
没有安全的方法。由于浮动是如何工作的,大于16777216 (或小于-16777216)的32位浮点数需要是偶数,大于33554432 (或小于-33554432)需要被4整除,大于67108864 (或小于-67108864)需要被8整除,等等。
发布于 2022-11-07 18:08:22
13815500在FLOAT中完全是可表示的。但你很接近安德鲁所说的-- 16777217并不是完全可以代表的,它将以1欧元或1美元或其他什么价格出售。
如果您没有十进制,您的选择是
FLOAT,,它凌驾于16,777,216.DECIMAL(9,0)之上,它可以处理高达10亿的数字。警告:如果你需要小数位,比如说so!_INT,它的峰值在大约2 billion.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来测量(例如传感器、距离等)
More
如果最大值为13815500,那么DECIMAL(64,56)将保存您的任何数字,并处理多达56位小数点。此外,您可以对这些数字进行精确的基本算术。注意:如果你是SUMming 1,000个这样的数字,你需要在小数点:DECIMAL(64,53)之前多加一个3位数字。对一百万个数字的总和:DECIMAL(64,50)。
如果您当前的数据位于一个FLOAT列中,那么您只有大约7个有效数字;其余的在存储这些数字时丢失了。你能恢复丢失的精度吗?如果是这样的话,就用一个合适的DECIMAL重新开始。如果不是,那么一位数字分析师会争辩说,你最好还是坚持FLOAT。一个SUM仍然是好的,大约6-7位有效数字.对于大多数用途来说,这已经足够了。
现在您几乎已经掌握了MySQL和数值分析的所有知识;您可以决定该做什么。
https://stackoverflow.com/questions/74335164
复制相似问题