2016-06-13 9 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 

私がしようとしている重要なのは、

32488.0(効果的に第三SIGのイチジクで切り捨て)切捨てさは32400.

なります

私はsum()とfloor()に加えて、入力データの変化に対して望ましい結果を得るために、ラウンドからハーフ・イーブン($ Input、-3)を利用しようとしました。

ご意見をいただければ幸いです。

答えて

1

あなたはmath:機能へのアクセスを持っている場合は分割すると10の適切なパワーを乗じて数字の対数とシフトを使用して、関連する桁数を計算し、XQueryの3.0ために提案:

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