从5.0.3版开始,在mysql表的十进制字段中存储负数 我的表中有几个字段的金额列类型为decimal 此列将包含存款金额(正值)或取款金额(负值) 我将正值存储为120,负值存储为-50 我对列求和,得到了预期的结果 Mysql版本为:5.1.33-community

从5.0.3版开始,在mysql表的十进制字段中存储负数 我的表中有几个字段的金额列类型为decimal 此列将包含存款金额(正值)或取款金额(负值) 我将正值存储为120,负值存储为-50 我对列求和,得到了预期的结果 Mysql版本为:5.1.33-community,mysql,types,Mysql,Types,当我查看有关decimal的mysql文档时,我对它们的描述感到困惑 在MySQL 5.0.3之前,如果插入 +0003.1转换为十进制(5,1)列,存储为+0003.1。从MySQL开始 5.0.3,存储为3.1。对于负数,一个字面值- 字符不再存储。 依赖旧版本的应用程序 必须修改行为以考虑 为了这个变化 当我在phpmyadmin中列出行时,我可以看到负号,当我计算结果时,结果与预期一致。但文件称不会出现任何迹象 用十进制存储负数好吗(我没在学校学习过吗?糊涂了)?。。。或者我们必须使

当我查看有关decimal的mysql文档时,我对它们的描述感到困惑

  • 在MySQL 5.0.3之前,如果插入 +0003.1转换为十进制(5,1)列,存储为+0003.1。从MySQL开始 5.0.3,存储为3.1。对于负数,一个字面值- 字符不再存储。 依赖旧版本的应用程序 必须修改行为以考虑 为了这个变化

  • 当我在phpmyadmin中列出行时,我可以看到负号,当我计算结果时,结果与预期一致。但文件称不会出现任何迹象

  • 用十进制存储负数好吗(我没在学校学习过吗?糊涂了)?。。。或者我们必须使用浮动

  • 我不知道浮点运算会使计算复杂化,有人建议在某些条件下使用十进制

    我想就此提出一些建议


  • 据我所知,文档中说它不会存储文字“-”字符,这意味着它现在可能正在执行其他有符号整数字段一直执行的操作,而是存储一个符号位来表示负数

    您仍然可以看到数字前面有一个减号,因为它是由MySQL生成的,是该符号位的结果

    如果你不理解符号位,你可以考虑一个已签名的字节如何将数字从-128存储到127,而无符号字节可以将数字从0存储到255。这是因为有符号数字中的8位中有一位用于存储+/-(1为负,0为正),而其余位提供的数字最多为2^7(-128或127)

    例如,如果1111位有一个符号位,它们将等于-7(负+4+2+1),但是如果它们是无符号的,它们将等于15(8+4+2+1)。存储的比特数仍然相同


    您可能想知道为什么有符号数字中的负边界可以使用第8位,而正边界限制为7位之和(比第8位少1位)。这是因为10000000同时被认为是负数和第8位,因为它的-0表示与表示0的00000000是冗余的。负零和正零之间没有区别,因此负的最高有效位总是该位本身的值(但为负)。

    nice。因此,它将按位保持符号状态。嗯。好的,没错;一个有符号的数字(+/-)的正范围是一个无符号数字的一半,因为它的容量少了一位,而这个范围的另一半是负数。请注意——负数通常是用编码的,所以四位字节中的
    1111
    等于
    -1
    谢谢@erburat!我应该指定我的简化示例使用“符号幅度”方法。