AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 270550
Accepted
Cade Roux
Cade Roux
Asked: 2020-07-08 05:54:44 +0800 CST2020-07-08 05:54:44 +0800 CST 2020-07-08 05:54:44 +0800 CST

格式“G17”与“G”

  • 772

我有一个关于这个小提琴的问题:

DECLARE @TestVal AS float = 8.88;
SELECT flt = @TestVal
    , xml = (SELECT Value = @TestVal FOR XML PATH(''), TYPE)
    , fmt17 = FORMAT(@TestVal, 'G17')
    , fmt = FORMAT(@TestVal, 'G')
    , cst = CAST(@TestVal AS nvarchar(50))
    , fmt17_roundtrip = CAST(FORMAT(@TestVal, 'G17') AS float)
    , fmt_roundtrip = CAST(FORMAT(@TestVal, 'G') AS float)
    , cst_roundtrip = CAST(CAST(@TestVal AS nvarchar(50)) AS float)
;

https://dbfiddle.uk?rdbms=sqlserver_2019&fiddle=0cf05f882eb24f53e9484f043af99446

我遇到了一些默认情况下以科学记数法输出的 XML 的问题,虽然它不是不正确或不准确的,但可读性不是很好。

我最初使用 FORMAT(floatcol, 'G17') 是因为此文档页面上的评论:

请注意,当与 Double 值一起使用时,“G17”格式说明符可确保原始 Double 值成功往返。这是因为 Double 是符合 IEEE 754-2008 的双精度 (binary64) 浮点数,最多可提供 17 位有效数字的精度。我们建议使用它而不是“R”格式说明符,因为在某些情况下,“R”无法成功地往返双精度浮点值。以下示例说明了一种此类情况。

好吧,今天我发现它似乎在字符串中添加了一些额外的无关紧要的数字。在这个特殊的例子中,它们都“往返”很好,但 G17 格式有一个额外的无关紧要的数字。

尽管它可能不会影响我的往返旅行,但我真的不想将其发送给具有额外数​​字的另一方。

现在我倾向于更改为 FORMAT('G'),但不确定它的含义。目前,这些 XML 导出中使用的格式字符串是存储在我的系统中的配置设置,因此继续使用 FORMAT 是最简单的,因为它不需要更改代码。

因此,在我对各种其他值进行测试之前,我的问题是 G 和 G17 总体上有什么区别,使用 G 而不是 G17 可能会遇到什么问题?

(是的,这个值需要是浮点数,而不是小数或整数或货币,并且浮点数的域可能因不同的测量/上下文而异)。

系统确实需要在 2012 年及更高版本上运行。

sql-server sql-server-2012
  • 1 1 个回答
  • 182 Views

1 个回答

  • Voted
  1. Best Answer
    Mikael Eriksson
    2020-07-08T11:38:18+08:002020-07-08T11:38:18+08:00

    我的问题是 G 和 G17 总体上有什么区别,使用 G 而不是 G17 可能会遇到什么问题?

    抱歉不知道,但您可以尝试使用 XML 做一些事情。不确定这是否可以使用,但无论如何都可以使用。

    在处理类型化的 XML 时,您不会为您的值获得科学记数法,而是为其他值获得科学记数法。因此,使用类型化 XML 并将生成的 XML 分配给绑定到模式的 XML 变量,使用 xs:double 实现双精度。

    这是一个模式。

    create xml schema collection SC_F as '  
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="F" type="xs:double">
        </xs:element>
    </xs:schema>
    ';  
    

    以及使用模式的查询。

    declare @TestVal float = 8.88;
    declare @X xml(SC_F);
    set @X = (select @TestVal as F for xml path(''), type);
    select @X;
    

    结果:

    <F>8.88</F>
    

    用 XML 修复它的另一种方法是将浮点值转换为 XML,然后将 XML 用作 XML 查询的值。现在这听起来比现在更复杂,我希望。

    declare @TestVal float = 8.88;
    select cast('' as xml).query('sql:variable("@TestVal")');
    

    结果

    8.88
    

    这是一些代码,显示了您为不同的解决方案获得的不同输出。根据值,您最终将获得所有方法的科学记数法。

    declare @T table(F float not null);
    
    insert into @T(F) values(8.88),(0),(0.0001),(0.00001),(0.000001),
      (0.0000001),(0.84551240822557006);
    
    declare @X1 xml;
    declare @X2 xml(SC_F);
    declare @X3 xml;
    declare @X4 xml;
    declare @X5 xml;
    
    set @X1 = (select F from @T for xml path(''));
    set @X2 = (select F from @T for xml path(''));
    set @X3 = (select cast('' as xml).query('sql:column("F")') as F from @T for xml path(''));
    set @X4 = (select format(F, 'G') as F from @T for xml path(''));
    set @X5 = (select format(F, 'G17') as F from @T for xml path(''));
    
    select @X1 as ScienceAllTheWay, 
           @X2 as UsingASchema, 
           @X3 as XMLTrickery,
           @X4 as FormatG,
           @X5 as FormatG17;
    

    结果:

    一路科学

    <F>8.880000000000001e+000</F>
    <F>0.000000000000000e+000</F>
    <F>1.000000000000000e-004</F>
    <F>1.000000000000000e-005</F>
    <F>1.000000000000000e-006</F>
    <F>1.000000000000000e-007</F>
    <F>8.455124082255701e-001</F>
    

    使用架构

    <F>8.88</F>
    <F>0</F>
    <F>0.0001</F>
    <F>1E-05</F>
    <F>1E-06</F>
    <F>1E-07</F>
    <F>0.84551240822557006</F>
    

    XML诡计

    <F>8.88</F>
    <F>0.0E0</F>
    <F>0.0001</F>
    <F>0.00001</F>
    <F>0.000001</F>
    <F>1.0E-7</F>
    <F>0.84551240822557</F>
    

    格式G

    <F>8.88</F>
    <F>0</F>
    <F>0.0001</F>
    <F>1E-05</F>
    <F>1E-06</F>
    <F>1E-07</F>
    <F>0.84551240822557</F>
    

    格式G17

    <F>8.8800000000000008</F>
    <F>0</F>
    <F>0.0001</F>
    <F>1.0000000000000001E-05</F>
    <F>9.9999999999999995E-07</F>
    <F>9.9999999999999995E-08</F>
    <F>0.84551240822557006</F>
    
    • 6

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve