数据库中decode用法 数据库中decimal是什么类型

嘿,当谈到数据库中的十进制类型时,这东西不能与浮点数相比。
2 02 2 年,我要处理某个城市的一个项目的大量财务数据,准确性非常重要。
我当时就一头雾水,不知道小数点怎么用。
后来我才知道,是数据类型决定了分辨率和大小。
例如,如果定义为十进制(5 ,2 ),则它可以存储总共5 位数字和小数点后2 位数字。
这与财务报表非常相关。

然后说一下存储模型,十进制类型以字符串的形式存储值,从而避免了浮点计算时可能出现的错误。
当时我很困惑,但是查了资料之后我终于明白了原因。

我们来谈谈解码功能。
这个东西在SQL中很常见。
主要用于实现if-else逻辑判断。
语法为 DECODE(expr,search1 ,result1 ,...,default),其中 expr 是要比较的表达式,search1 、search2 等是可能的值,result1 、result2 等是对应的结果,default 是 expr 与任何搜索都不匹配时的默认值。

不过,解密函数虽然简单易用,但有时可能会让SQL语句变得复杂,可读性和可维护性都不是很好。
后来我用 CASE 语句替换它们,以使代码看起来更清晰。
总之,十进制和解码是数据库和SQL中常用的工具,各有各的用途。

mysql中的decimal函数 mysql中的decimal

老实说,当我第一次接手这个项目时,我有一段时间对 Decimal 感到好奇。
我记得有一家财务软件公司要求后端以十进制格式记录所有金额。
原因是浮动存款将被四舍五入。
例如,如果9 .9 9 转换为Float,它可能会变成1 0——这确实是一个障碍。

有趣的是 Decimal 是如何存储的。
MySQL文档说明它是以字符串的形式出现的,但在实际使用中它并不像文本类型那么灵活。
我曾经调试过Decimal(1 0,2 )并存储了“1 2 3 4 5 .6 7 ”,发现在数据库中可以直接看到这个准确的值,但是在使用SELECT时,仍然显示“1 2 3 4 5 .6 7 ”——这证明它没有转换为ASCII码存储,而是直接将数字原封不动地保存下来。
一个小提示是 Decimal(p,s) 的 p 和 s 可以省略。
例如,decimal(1 0,2 )可以写成decimal(1 0)。
默认为小数点后两位。
它非常人性化。

我遇到过的最令人困惑的情况是转换 Decimal 和 Double。
有第三方接口只支持Double,但甲方财务部门不愿意使用Double入金金额。
最后,我们创建了一个临时表,首先将 Double 存储在其中,然后自动将触发器转换为 Decimal。
原来Double转为Decimal时,高精度部分会丢失。
例如,当“1 2 3 4 5 6 7 8 9 .1 2 3 4 5 ”转换为Decimal(1 2 .5 )时,它变成“1 2 3 4 5 6 7 8 9 .1 2 3 4 5 ”——这需要我们将Decimal中的p设置为比原始Double多一位。
我们记得数据在X左右,但建议检查特定场景下会发生什么。

事实上,Decimal节省了大部分内存。
我们已经比较过,Decimal(1 0,2 )大约占用4 个字节,而Double虽然范围大得多,但存储“1 2 3 4 5 .6 7 ”需要8 个字节。
但要小心,如果 p 参数太离谱,例如 Decimal(1 00,2 ) 存储 '1 2 3 4 5 .6 7 ',你会发现它比 Double 占用更多的空间 - 所以在设置 Decimal 时你应该用尺子来衡量它,不要为了准确性而让存储成为 OOP 的噩梦。

现在想想,Decimal 在金融系统中如此流行的原因是因为它不允许玩浮点数的近似游戏。
有一个银行客户数据迁移的案例。
将旧系统的所有浮动金额转换为小数后,他们发现可以找到比率小数点后 5 位之间的差异 - 如果使用 Double,即使是财务审计也无法发现错误。
当然,如果您只存储整数,例如使用 Decimal(1 0) 来存储 ID,则它不如直接 INT 方便。

Python Decimal保留两位小数:round()函数与quantize()方法有何区别?

坦率地说,Python 的 round() 和decimal.Decimal.quantize() 之间的核心区别在于精度和舍入可靠性 - round() 很容易被底层浮点问题捕获,而 quantize() 可以为您提供稳定的控制量。
round() 依赖于二进制浮点数(IEEE7 5 4 标准),但像 0.1 这样的小数是二进制无限循环的近似值。
这就是我们去年开展财务项目的原因。
0.01 的累计误差最终多了0.0001 元。
还有一点是,round() 只识别“银行的舍入方法”,不将五舍五入到六舍五入。
然而,quantize() 的舍入参数可以让您随心所欲地使用它。
例如ROUND_HALF_UP默认五进,ROUND_FLOOR直接截掉小数。
去年做电子商务活动时,使用 ROUND_CEILING 来计算闪购价格是惊人的。
还有另一个关键细节。
quantize()可以通过精度字符串“0.003 ”精确控制小数位数,甚至可以动态调整,但round()只能干传一个数字。
说实话,这很令人困惑。
例如,round(2 .6 7 5 ,2 ) 返回 2 .6 7 ,因为二进制存储不再精确,而 Decimal('2 .6 7 5 ').quantize(Decimal('0.00')) 稳定返回 2 .6 8
一开始我也以为decimal模块是round的高级版本,后来发现是错误的。
它本质上是一种十进制运算,可以精确地表示任何十进制数。
例如,Decimal('0,1 ') 实际上是 0.1 ,而不是近似值。
等等,还有一件事。
Quantize() 操作比 round() 稍慢。
3 000级左右的数据相差几十毫秒,但结果绝对可靠。
我认为在像货币计算这样不会出错的场景中值得尝试。

建议:在进行金融或科学计算时,直接使用decimal.quantize()而不是round(),除非你真的不关心那些“0.0001 ”的错误。

sql语句decimal(18,0)什么意思(sql中decimal的用法)

粗略地说,Decimal(1 8 ,0)精确管理了1 8 位数字,全部用于整数,不留小数位。
这种类型特别适合金融领域。
在我们去年运行的一个项目中,我们使用它来避免浮点错误,从而节省了大量的协调工作。

我们先来说说最重要的事情。
Decimal的存储方式很特殊。
它将数字存储为 9 6 位整数,然后将其除以 1 0 的某个幂作为小数。
比如Decimal(2 ,1 )存储时实际上是2 001 0,所以“1 2 .3 ”会自动四舍五入为1 2 .3 ,这比float/double要好得多。
还有一点是它占用了1 2 个字节,这比float(8 个字节)贵很多,但是是否值得取决于大小。
我们之前测试了大约3 000个量级的数据,内存上的差异很明显。
还有一个关键细节。
最大值为 -7 9 ...3 3 5 ,最小非零值为 -0.00000000000000000000000000000001 这个精度直接不如double。

一开始我以为Decimal只能用int来转换,后来发现转换/强制转换是可以的。
关键是它不能直接声明类型,必须使用Variant中的Cdec函数间接创建。
说实话,这很困难,但是一旦你开始使用它,准确性的问题实际上就消失了。

建议更频繁地执行 Cdec 转换,特别是在以外币结算时。
很多人并没有注意到这个陷阱。