DECIMAL类型舍入额外的小数而不截断mysql

时间:2014-06-30 06:55:17

标签: mysql database types decimal rounding

DECIMAL类型应代表' Exact',但它将数字四舍五入,例如:

CREATE TABLE `foo`(p1 DECIMAL(5,2));

INSERT INTO `foo` VALUES (587.487);

SELECT * FROM `foo`;

它存储587.49而不是587.48,这是'确切的'截断值,如何以正确的十进制方式存储值,我需要将其精确地保存为'没有舍入

P.S:我使用严格模式

2 个答案:

答案 0 :(得分:0)

试试这个

CREATE TABLE `foo`(p1 DECIMAL(5,2));

INSERT INTO `foo` VALUES (truncate(587.487,2));

SELECT * FROM `foo`;

检查SQL Fiddle

答案 1 :(得分:0)

如果您希望以与decimal( 5, 2 )相同的格式输入精确输入或截断为5位数,包括小数部分。

示例

mysql> select @n1:=587.487 n1 
    ->      , cast( substr( @n1, 1, 6 ) as decimal( 5, 2 ) ) s1
    ->      , @n2:=587 n2
    ->      , cast( substr( @n2, 1, 6 ) as decimal( 5, 2 ) ) s2
    ->      , @n3:=587 n3, substr( @n3, 1, 6 ) s3
    -> ;
+---------+--------+-----+--------+-----+------+
| n1      | s1     | n2  | s2     | n3  | s3   |
+---------+--------+-----+--------+-----+------+
| 587.487 | 587.48 | 587 | 587.00 | 587 | 587  |
+---------+--------+-----+--------+-----+------+
1 row in set (0.00 sec)

注意如果您希望输出为十进制格式,则需要重新整数。

但是,truncatesubstr更好的选择,因为如果缺少则用零填充小数部分。

select truncate( 587.487, 2 ) t1, truncate ( 587.4, 2 ) t3;
+--------+--------+
| t1     | t3     |
+--------+--------+
| 587.48 | 587.40 |
+--------+--------+
1 row in set (0.06 sec)