DECIMAL类型应该表示'Exact',但它是四舍五入的数字,例如:
CREATE TABLE `foo`(p1 DECIMAL(5,2));
INSERT INTO `foo` VALUES (587.487);
SELECT * FROM `foo`;
它存储587.49
而不是587.48
,这是'精确'截断的值,我如何以正确的方式存储小数的值,我需要'精确'而不是四舍五入
p。S:我使用严格模式
试试这个
CREATE TABLE `foo`(p1 DECIMAL(5,2));
INSERT INTO `foo` VALUES (truncate(587.487,2));
SELECT * FROM `foo`;
检查 SQL小提琴
如果你想要一个精确的然后输入相同的格式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)