2016-07-28 121 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

是的,但是他表示他不知道精度並且不想輪轉...... –

相關問題