DECIMAL类型应代表' Exact',但它将数字四舍五入,例如:
CREATE TABLE `foo`(p1 DECIMAL(5,2));
INSERT INTO `foo` VALUES (587.487);
SELECT * FROM `foo`;
它存储587.49
而不是587.48
,这是'确切的'截断值,如何以正确的十进制方式存储值,我需要将其精确地保存为'没有舍入
P.S:我使用严格模式
答案 0 :(得分:0)
试试这个
CREATE TABLE `foo`(p1 DECIMAL(5,2));
INSERT INTO `foo` VALUES (truncate(587.487,2));
SELECT * FROM `foo`;
答案 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)
注意如果您希望输出为十进制格式,则需要重新整数。
但是,truncate
比substr
更好的选择,因为如果缺少则用零填充小数部分。
select truncate( 587.487, 2 ) t1, truncate ( 587.4, 2 ) t3;
+--------+--------+
| t1 | t3 |
+--------+--------+
| 587.48 | 587.40 |
+--------+--------+
1 row in set (0.06 sec)