2016-06-13 41 views
2

我試圖對3位有效數字進行求和和取整。在XQuery中進行求和和取整

的總和值的舍入如下應該發生:

527000.0    527000 
11920.0     11900 
131900.0    131000 
5960.0     5960 
14400.0     14400 
7200.0     7200 
17130.0     17100 
8565.0     8560 

我想最關鍵的事情是向下取整(截斷有效地在第3 SIG圖)

32488.0將成爲32400.

我嘗試過利用round-to-half-even($ Input,-3)以及sum()和floor()來嘗試獲得輸入數據變化的期望結果,但沒有多少運氣。

任何建議將不勝感激。

回答

1

如果你有機會獲得提議的XQuery 3.0 math:功能,計算的使用數量對數和移位除以和十的適當功率乘以相應的位數:

for $number in (527000.0, 11920.0, 131900.0, 5960.0, 14400.0, 7200.0, 17130.0, 8565.0, 42.0, 0) 
let $log := if ($number > 0) then floor(math:log10($number)) else 1 
let $pow := math:pow(10, $log - 3) 
return concat($number, ': ', floor($number div $pow) * $pow) 

這將返回預期的數字:

527000: 527000 
11920: 11920 
131900: 131900 
5960: 5960 
14400: 14400 
7200: 7200 
17130: 17130 
8565: 8565 
42: 42 
0: 0 

如果你堅持使用XQuery 1.0或沒有獲得先進的數學函數,它變得更有趣(醜陋的)。有些字符串操作呢?

for $number in (527000.0, 11920.0, 131900.0, 5960.0, 14400.0, 7200.0, 17130.0, 8565.0, 42.0, 0) 
let $string := xs:string($number) 
let $length := string-length($string) 
return concat($number, ': ', substring($string, 1, 3), string-join(for $i in 4 to $length return '0')) 

你當然可以轉換回數字了。我不確定是否會有更優雅的方式;如果代碼支持非自然數或非正數,則需要對此代碼進行擴展。

+0

不幸的是我堅持的XQuery 1.0,這樣醜陋的做法可能被採納。感謝您的回覆,我會仔細研究一下。 – user1905307

0

我覺得這個解決它

let $String := xs:string($XAMT) 
let $Length := string-length($String) 
let $SubString := substring($String, 1, 3) 
let $TrailingZeros := for $i in 4 to $Length -2 return '0' 


let $Result := concat($SubString, string-join(($TrailingZeros),'')) 



return $Result