是圆形截断正常工作在TSQL简单的浮动?



当使用ROUND函数和第三个参数截断浮点数时,我发现了一个奇怪的行为:

declare @f2 float = 1.24;
select round(@f2, 2, 1)

输出:

1.23

我完全意识到浮点类型的近似性质,但对于这样一个"简单"的类型来说,它似乎不正确。号码。

代码运行在:Copyright (C) 2019 Microsoft Corporation Enterprise Edition:基于Windows Server 2019 Standard 10.0 (Build 17763:)的基于核心的许可(64位)

declare @f2 float = 1.24;中,源文本1.24被转换为浮点格式IEEE-754 binary64(也称为"双精度")。这个转换的结果恰好是1.239999999999999999911182158029987476766109466552734375,这是在binary64格式中最接近1.24的数字。这个数字等于5,584,463,537,939,415•2−52。下一个更大的可表示数是5,584,463,537,939,416•2−52= 1.2400000000000002131628207280300557613372802734375,它比1.24稍远。

select round(@f2, 2, 1)操作于1.239999999999999999911182158029987476766109466552734375。将其截断为小数点后的两位,得到1.23。

它确实按照它应该的方式工作。根据文档,它做了它应该做的事情。Round应该将值舍入到指定的长度。由于计算机的工作方式与人类略有不同,所以从技术上讲,1.24对计算机来说是1.2399999。如果你要使用Round,像这样

declare @f2 float = 1.24;
select round(@f2, 2)

你会把变量四舍五入到第二个小数点后你会得到结果1.24。但是由于你试图TRUNCATE,通过在Round中指定的长度之后添加任何与0不同的数字来完成。就像你在你给我们的例子中所做的那样,你不会得到截断的1.24,而是截断的1.23999999,它将返回1.23。

最新更新