gpt4 book ai didi

sql - 在 SQL Server 2008 中舍入时的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 04:33:41 24 4
gpt4 key购买 nike

在某些时候,我有一个数字(28,10)并且我将它投入金钱(我知道它是坏的,但由于遗留原因我必须退钱)同时我还必须设置符号(乘以+1/-1).

在第一次尝试中,我将 +/-1 转换为匹配数字类型。

对于值 133.3481497944,我们遇到了一个奇怪的行为(我已经简化了实际代码,以便仅保留演示问题所需的元素):

SELECT CAST(CAST(133.3481497944 AS numeric(28,10))*cast(1 AS numeric(28,10)) AS money)

133.3482



这是不正确的四舍五入...

删除类型转换解决问题
SELECT CAST(CAST(133.3481497944 AS numeric(28,10)) * 1 AS money)

133.3481



有人知道 SQL 中发生了什么吗?乘以 1 和 cast(1 AS numeric(28,10)) 如何影响舍入的结果?

最佳答案

在乘以数字时,SQL 使用以下规则来确定输出的精度和小数位数:

p = p1 + p2 + 1
s = s1 + s2

这是有道理的 - 您不希望 1.5 * 2.5 被截断为小数点后一位。你也不希望 101 * 201 被限制为 3 位精度,给你 20300 而不是 20301。

在您的情况下,这将导致精度为 57 和比例为 20,这是不可能的 - 最大精度和比例为 38。

如果结果类型太大,则会牺牲十进制数字以保留结果的整数(最重要)部分。

来自 SQL Programmability & API Development Team Blog :

In SQL Server 2005 RTM (and previous versions), we decided preserve a minimum scale of 6 in both multiplication and division.



因此,您的答案取决于您需要乘数的大小和精度。为了保留十进制精度的十位数字。如果乘数需要大于 9 的比例,则十进制数字可能会被截断。如果您使用较小的精度和比例,则应该没问题:
SELECT CAST(CAST(133.3481497944 AS numeric(28,10))*cast(1 AS numeric(9,7)) AS money)

yield 133.3481 .

关于sql - 在 SQL Server 2008 中舍入时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com