在 sql server 中未按预期实现使用 round 函数的截断

Posted

技术标签:

【中文标题】在 sql server 中未按预期实现使用 round 函数的截断【英文标题】:Truncation using round function isn't achieved as expected in sql server 【发布时间】:2021-10-27 09:10:25 【问题描述】:

我有一个存储在浮点数据类型中的字段。我需要将其转换为数字,而不会在转换过程中进行隐式四舍五入。

我已经尝试了 round(float_data,scale,1)。在大多数情况下似乎都可以正常工作。但是当小数位后的位数小于圆形函数中提到的比例时,它会尝试降低数字而不是在末尾附加 0。

例如,round (0.0243,5,1) 返回 0.02429。为什么不简单地将数字截断为提到的位数?

我知道这个问题是当我们使用 float 作为源数据类型但我无法更改源数据类型时。

当通过 ssis 实现相同的截断时,会发生相同的截断。 sql中有什么方法可以实现吗?

【问题讨论】:

转换为十进制数据类型。 我想在转换时避免四舍五入...我不能简单地转换为十进制而不完美实现截断 你的意思是你真的不想四舍五入,而是截断?再用一位数字转换为十进制,然后截断最后一位。浮点数学充满了惊喜:) 【参考方案1】:

因为转换为浮点数时,十进制 0.0243 存储为 0.02429999969899654388427734375,截断为 0.02429。看起来你想要舍入而不是截断,例如

declare @f float = 0.0243
select round(@f,5,0)

【讨论】:

嗨,大卫,0.0243 只是数据库中存储在浮点数据类型中的一个数字。将其用作示例以进行说明。我存储了数千个数字。当存储的数字在小数位后的位数大于在 round 中提到的比例时,Round 函数非常适合截断。例如,如果数据库中的数字是 0.02429999...834- 使用 round 我会得到 round(0.0242999,5,1) 为 0.02429 这对我来说没问题。当来自 db 的数字是 0.0243 并且这应用于我得到 ​​0.02429 的回合时,我希望 0.02430 任何实现这一目标的线索都会有所帮助 但是 0.0243 根本 不是 一个有效的浮点数。最接近的浮点数是 0.02429999969899654388427734375,这是您实际存储的值。

以上是关于在 sql server 中未按预期实现使用 round 函数的截断的主要内容,如果未能解决你的问题,请参考以下文章

Firebase onAuthStateChanged 在 React App 中未按预期运行

自动填充在 Excel 中未按预期工作

在 Postgres 13 中未按预期工作的表设置默认权限

Laravel 5.6 通配符路由在域中未按预期运行

SVG 在 Firefox 中未按预期呈现,即

@State var 在 LazyVGrid 中未按预期更新