我有一个关于这个小提琴的问题:
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 年及更高版本上运行。
抱歉不知道,但您可以尝试使用 XML 做一些事情。不确定这是否可以使用,但无论如何都可以使用。
在处理类型化的 XML 时,您不会为您的值获得科学记数法,而是为其他值获得科学记数法。因此,使用类型化 XML 并将生成的 XML 分配给绑定到模式的 XML 变量,使用 xs:double 实现双精度。
这是一个模式。
以及使用模式的查询。
结果:
用 XML 修复它的另一种方法是将浮点值转换为 XML,然后将 XML 用作 XML 查询的值。现在这听起来比现在更复杂,我希望。
结果
这是一些代码,显示了您为不同的解决方案获得的不同输出。根据值,您最终将获得所有方法的科学记数法。
结果:
一路科学
使用架构
XML诡计
格式G
格式G17