sql-server - SQL Server 十进制除法不四舍五入结果
问题描述
我尝试了下面的乘法和除法,并期望与舍入相同的结果。这两个操作的结果类型都是 Decimal(38,6) 我想知道为什么在除法的情况下结果不四舍五入?
结果应根据以下链接对乘法和除法进行四舍五入 在 此处输入链接描述
select cast(1.225114854 as decimal(38, 9)) * cast(1.000000000 as decimal(28, 9)) as multiply
结果:1.225115
select cast(1.225114854 as decimal(38, 9)) / cast(1.000000000 as decimal(28, 9)) as division
结果:1.225114
select 1.225114854 / 1.000000000
结果:1.22511485400000000000
解决方案
SQL Server 在十进制数的乘法和除法情况下的行为方式不同,因此位数不同:
假设,e1=decimal(p1,s1) and e2=decimal(p2,s2)
Operation Result precision Result scale *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)
结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减小,以防止结果的整数部分被截断。
因此,当您乘以 38 位精度小数时,结果会被截断。您可以使用以下计算来获得更好的结果:
select cast(1.225114854 as decimal(15,9))*cast(1.000000000 as decimal(15,9)) as multiply
select cast(1.225114854 as decimal(15,9))/cast(1.000000000 as decimal(15,9)) as division
以下链接应该可以澄清您的大部分疑问:
https://www.codeproject.com/Articles/769823/Losing-Precision-After-Multiplication-in-SQL-Serve
推荐阅读
- google-cloud-composer - Google Cloud Composer vCPU 时间混乱
- shopify - 从自定义窗口中选择时如何在 Shopify 中获取 Collection 对象
- math - 计算营养素的最有效方法
- c++ - 单独的模板类声明和实现
- docker - Docker Buildx 功能 - 不缓存
- javascript - Laravel SortableJS AJAX - 如何重新排列顺序
- django - 未提供必填字段时保存表单集?
- ruby-on-rails - Rails - 范围上的逻辑运算符,这可能吗?
- python - 将数据框字符串类别转换为数字
- macos-catalina - 用于移动文件类型的 Apple 脚本