对double数值进行round取舍结果不是四舍五入

double类型数值进行round取舍,结果不是四舍五入。
gbase> create table t(c1 double);
Query OK, 0 rows affected (Elapsed: 00:00:00.55)
gbase> insert into t values(41.325);
Query OK, 1 row affected (Elapsed: 00:00:00.03)
gbase> select c1,round(c1,2) from t;
+--------+-------------+
| c1     | round(c1,2) |
+--------+-------------+
| 41.325 |       41.32 |
+--------+-------------+
1 row in set (Elapsed: 00:00:00.00)


2 回答

DOUBLE代表一个浮点型数值,它所存储的数值不是一个准确值。所以造成了结果的差别。
double类型作round,采取了“四舍六入五凑偶”的规则。
“四舍”是指≤4 时舍去,
"六入"是指≥6时进上,
"五凑偶"指的是根据5后面的数字来定,当5后有数时,舍51
5后无数或为0时,需要分两种情况来讲:
5前为奇数,舍51
5前为偶数,舍5不进。

2018-7-5 11:08
grander 发表于 2018-7-5 11:08
DOUBLE代表一个浮点型数值,它所存储的数值不是一个准确值。所以造成了结果的差别。对double类型作round, ...

可以通过转化数值字符为精确数值类型解决,如下:
gbase> select c1,round(cast(c1 as decimal(16,5)),2) from t;
+--------+------------------------------------+
| c1     | round(cast(c1 as decimal(16,5)),2) |
+--------+------------------------------------+
| 41.325 |                              41.33 |
+--------+------------------------------------+
1 row in set (Elapsed: 00:00:00.00)
或者使用decimal精确数值类型
gbase> create table tt(c1 decimal(16,3));
Query OK, 0 rows affected (Elapsed: 00:00:00.48)
gbase> insert into tt values(41.325);
Query OK, 1 row affected (Elapsed: 00:00:00.03)
gbase> select c1,round(c1,2) from tt;
+--------+-------------+
| c1     | round(c1,2) |
+--------+-------------+
| 41.325 |       41.33 |
+--------+-------------+
1 row in set (Elapsed: 00:00:00.01)

2018-7-5 11:09

撰写回答

您需要登录后才可以回帖 登录 | 立即注册

提问者

发布147
回答384

相关资料