即使使用DECIMAL,MySQL也无法处理大值

时间:2011-03-30 01:07:01

标签: mysql

DECIMAL应该是准确的。事实并非如此。它变得像疯了一样!

TABLE:
account_balance DECIMAL(18,4)

如果我插入43210987654321.9999 它转向43210987654322.0000

如果我插入43210987654321.9876 它转向43210987654321.9840

为什么?如果我在创建表时使用大于18的数字,那就更糟了。

修改
我发布了这个澄清编辑,因为有些人不知道DECIMAL数据类型。

DECIMAL数据类型是FIXED POINT数据类型,而不是FLOATING POINT数据类型。

使用它的原因是:
(1)存储具有精确精度的十进制值的海量数字 (2)防止使用浮点计算时无法防止的舍入错误。因此,对DECIMAL值的任何计算都应该是精确的......没有舍入误差。

POSTRESQL
http://www.postgresql.org/docs/8.1/static/datatype.html

数字 - 用户指定的精度 - 完全 - 无限制

数字类型可以存储最多1000位精度的数字并完全执行计算。特别推荐用于存储需要准确性的货币金额和其他数量。但是,与整数类型或下一节中描述的浮点类型相比,对数值的算术运算速度非常慢。

十进制和数字类型是等效的。 这两种类型都是SQL标准的一部分。


的MySQL

DECIMAL(,)DOUBLE存储为字符串,允许固定的小数点 http://www.htmlite.com/mysql003.php

MySQL DOC
定点(精确值)类型

DECIMAL和NUMERIC类型存储精确数字数据值。这些类型用于,当保留精确精度非常重要时,例如使用货币数据。在MySQL中,NUMERIC实现为DECIMAL,因此以下关于DECIMAL的评论同样适用于NUMERIC。

从MySQL 5.0.3开始,DECIMAL值以二进制格式存储。以前,它们存储为字符串,其中一个字符用于值的每个数字。 http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

M的最大值65表示DECIMAL 值的计算精确到65位。这个65位精度的限制也适用于精确值数字文字,因此最大范围这些文字与以前不同。 (在旧版本的MySQL中,十进制值最多可以有254位。但是,计算 使用浮点数完成,因此是近似值不准确。)

涉及精确值十进制数的

计算 精确到65位。这比MySQL 5.0.3(254位)之前允许的最大位数少,但精确值精度更高。以前的计算是使用双精度浮点运算的,精度为52位(大约15位十进制数)。

http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html

1 个答案:

答案 0 :(得分:4)

我在我的本地mysql 5.1.36上测试过它并没有圆。 你在用什么版本

另外,你用什么来插入。在插入mysql之前,你确定它是mysql舍入而不是存储。