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



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)

最新更新