【问题标题】:Full precision output of floating point types in SQL Server Management StudioSQL Server Management Studio 中浮点类型的全精度输出
【发布时间】:2020-10-16 17:26:49
【问题描述】:

我将值 1555.4899999999998 存储在 float 列中,默认精度 (53)。当我做一个简单的select 时,SSMS 会舍入输出而不是用所有可用的精度打印它。最近这给我造成了一些问题,因为打印的值不能作为 float 文字来匹配实际存储的值。

例如(请注意,这两个数字在默认 float 中都有精确的表示),

declare @f1 float;
declare @f2 float;
set @f1 = 1555.49;
set @f2 = 1555.4899999999998;
select @f1, @f2;
select STR(@f1,30,15), STR(@f2,30,15);

输出:

1555.49 1555.49
1555.490000000000000    1555.489999999999800

在查询分析器中,第一个 select 输出:

1555.49 1555.4899999999998

这就是我想从 Management Studio 获得的行为。有没有办法防止 SSMS 在其结果显示中四舍五入?

【问题讨论】:

    标签: sql-server floating-point ssms


    【解决方案1】:

    没有。

    SQL Server Management Studio 为显示目的对浮点值进行舍入; 有一个Connect suggestion to change this behavior,但它“按设计”已关闭。(Microsoft Connect,Microsoft 软件的公共问题跟踪器已停用)

    但是,SQLCMDosql 和查询分析器没有。

    SQLCMD -E -S server -Q"SELECT CONVERT(FLOAT, 1555.4899999999998)"
    

    【讨论】:

    • 我点击链接阅读:Microsoft Connect Has Been Retired
    • 与@BernhardDöbler 的评论相同。如果可能的话,有人可以更新链接吗?
    【解决方案2】:

    您是否有理由宁愿使用浮点类型而不是小数类型?浮点数存储为分数,这导致它们在对其进行操作时通常会稍微不准确。当您的图形应用程序的不准确性远低于像素大小时,这是可以的,但在您处理金钱的会计应用程序中,这是一个大问题。

    我敢说,对于大多数应用程序来说,小数的准确性比使用浮点数在速度或大小方面的任何好处更重要。

    【讨论】:

    • 不幸的是,数据库架构不在我的控制范围内。我 100% 同意 float 是此应用程序的错误选择,但如果它是正确的类型,我仍然希望在 Management Studio 中得到更准确的表示。
    【解决方案3】:

    编辑我原来的帖子。当我遇到这个页面时,我试图解决一个稍微不同的问题。我只是想要一个浮点类型来返回一个“常规”数字,而不是科学记数法。

    最初建议两个皈依者。到此结束。下面的 7 可以更改为显示尽可能多的小数位。替换和修剪去掉前导零和尾随零。

    REPLACE(RTRIM(LTRIM(REPLACE(STR(x, 20, 7),'0',''))),'','0')

    【讨论】:

    • 目的不是转换为 VARCHAR。我的示例中的 STR() 调用已经这样做了。我一直希望更改 SSMS 的默认行为,而不必向我的查询添加转换。顺便说一句,小数点后 5 位也不足以消除我示例中的值的歧义。为此,您至少需要 DECIMAL(28,13)。
    • 我编辑了我的答案。仍然对 SSMS 没有帮助。只返回我想要的字符串表示。也许是一个有用的解决方法。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多