2016-07-28 80 views
2

将float转换为字符串时出现问题,但t-sql以科学格式返回它。将float转换为nvarchar保留十进制变量部分

例子:

declare @amount float 
set @amount=5223421341.23 
print cast(@amount as nchar(20)) 

回报“5.22342e + 009”

嗯,我试过的功能STR但有一点:我不知道有多少小数可能有浮动,我不想围绕它。

有一种方法可以返回float为nchar,其精度与float声明的精度相同?

非常感谢。

+0

显然不是。有没有理由不能使用'Decimal'而不是'float'? –

回答

1

小数位数有问题。下面的代码显示小数值是失真的,我无法找到解决方法。如果有一种方法可以确定浮点的精度,那么结果可以四舍五入到正确的值。

以未知的精度,我还没有找到解决方案。

Declare @Amount float 
Set @Amount=5223421341.23 

Select LTrim(RTrim(Str(@Amount, 1000, 1000))) 

产地:5223421341.2299995000000000

基于什么我读花车只定义所以这可能是你能得到的最好近似。

https://msdn.microsoft.com/en-us/library/ms173773.aspx

http://www.webopedia.com/TERM/F/floating_point_number.html

注意,大多数浮点数计算机可以代表是 只是近似值。使用浮点值编程时遇到的挑战之一是确保近似值导致合理的结果 。如果程序中不太注意,近似值的小差异可以滚雪球到最终结果变得毫无意义的程度。

0

根据微软的SQL Server文档,(https://msdn.microsoft.com/en-us/library/ms173773.aspxfloatfloat(53)的代名词,和float(53)具有15位精度。

但是精度的15位数字没有说明指数。指数约为300.这意味着浮点数能够表示包含大约300个零的数字。这就是为什么科学记数法是不可或缺的。

如果科学记数法对您来说不是问题,那么21个字符就足以容纳15个数字,其中有一段时间,加上尾随的e+999

但由于科学记数法是你的一个问题,那么你必须有一个文本字段大到足以容纳形式 0.0000000000000000000000000000000数... 00000000000000000000000000723237435435644 (这是近300个零后跟15位) 和 377733453453453000000000000000000 ... 00000000000000000000000000000000000000. (这是15位数字,后面接近300个零。)

很明显,你将需要一些非常大的文本字段来表达你想要做的事情。

因此,底线是,而不是寻找解决问题的方法,我建议修改你在这里完成的任务。

0

根据Microsoft,SQL中最好的方法很可能使用STR函数。

declare @amount float 
set @amount=5223421341.23 
print str(@amount,20,6) 
print convert(VARCHAR(50),rtrim(ltrim(str(@amount,20,6)))) 

这似乎将覆盖大多数情况下,但你需要找出你的数据设置的最大值和最小值,也是最大精度。

+0

这不会工作,因为他不知道精度。在str函数中将你的6改为8,你将会遇到和我一样的问题... –

+0

但是如果他知道他没有比6更精确的浮点数,那么一切都很好。这可能可以通过总结领域和转换后的领域来确定,并且看看它们是否相等 – UnhandledExcepSean

+0

是的,但是他表示他不知道精度并且不想轮转...... –

相关问题