DECIMAL 应该是精确的。事实并非如此。它疯狂地旋转!
表:
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
numeric -- 用户指定的精度 --精确--无限制
numeric 类型可以存储高达 1000 位精度的数字并精确执行计算。特别建议用于存储货币金额和其他需要精确性的数量。但是,与整数类型或下一节中描述的浮点类型相比,数值算术非常慢。
Decimal 和 numeric 类型是等效的。这两种类型都是 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