mysql Decimal 运算;

发布时间:2025-12-09 13:45:35 浏览次数:4

MySQLDECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。

要定义数据类型为DECIMAL的列,请使用以下语法:

column_nameDECIMAL(P,D);

在上面的语法中:

  • P是表示有效数字数的精度。P范围为1〜65
  • D是表示小数点后的位数。D的范围是0~30。MySQL要求D小于或等于P

与INT数据类型一样,DECIMAL类型也具有UNSIGNEDZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。

如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。

(其中 p为总位数, 就和float 与double类型的一样 例如 :amount DECIMAL(6,2);这个表示总共位数有6位,小数占去2位,整数部分为最多4位,最大与最小值9999.99~-9999.99;)

其中 在MySQL中执行加减乘除

create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2)  -- 取值范围是 -999.99 到 999.99);ALTER TABLE decimal_testMODIFY score DECIMAL(6,3) UNSIGNED;-- 正数:insert into decimal_test(score) VALUES(1.23); -- 1.23insert into decimal_test(score) VALUES(123.45); -- 123.45insert into decimal_test(score) VALUES(123.455); -- 123.46insert into decimal_test(score) VALUES(123.451); -- 123.45insert into decimal_test(score) VALUES(123.451123); -- 123.45insert into decimal_test(score) VALUES(12345.451123); -- Out of range value for column 'score' - 负数:insert into decimal_test(score) VALUES(-1.23); -- -1.23insert into decimal_test(score) VALUES(-12.34); -- -12.34insert into decimal_test(score) VALUES(-123.45); -- -123.45insert into decimal_test(score) VALUES(-999.45); -- -999.45insert into decimal_test(score) VALUES(-12343); -- Out of range value for column 'score'UPDATE decimal_test  t  set t.`score`=t.`score`/100 WHERE t.id=1; --0.01UPDATE decimal_test  t  set t.`score`=t.`score`-100 WHERE t.id=1;-- Out of range value for column 'score' at row 1-- 除了减法,其他测试正常

从上边总结可以看出 其中要用sql 直接做运算 除了减法 其他方法可以正常执行;

嗯 那么碰到减法了,如果当前存储数据比要减少的数据小的话,那最好另外的地方直接做获取结果,最终在需要的地方做更新就好;

追加, 在java 中 直接给mysql 传decimal 类型数据 让mysql 做计算仍然会出现误差, 最终方案是将其在更新之前 获取结果,最终直接给mysql 传递需要更改的值,做存储就好!!

just do it!

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477