2016-05-12 6 views
4

ColdFusionとは10090000000557765 = 10090000000557763と考えています。ColdFusion多数比較

私は理由を知りますが、ColdFusionが同じではないことを知るための最良の方法を知る必要があります。私はCompare()メソッドについて読んでいますが、それもtrueを返します。私はそれらを文字列としてキャストし、また真実を返します。

文字列を2つの部分に分割し、それぞれを個別に比較し、true/falseを返すカスタム関数を書くことを考えましたが、それはダムのようです。

私は次のことを試してみた:明確にするため

Val(a) EQ Val(b) 
ToString(a) EQ ToString(b) 
a.compareTo(b) 

私はDBを使用しています。私はbigintを使用することを制御しません。私は早くJavascriptでこれらを処理できないことを学んだので、私はすべてのbigintフィールドを私のモデルでvarcharに変換しました。しかし、CFは文字列を比較するのに問題があり、数字に戻すことはできません。 http://cflive.net/

<cfif '10090000000557765' EQ '10090000000557763'> 
True 
<cfelse> 
False 
</cfif> 

、それはtrueを返し:

例私はちょうどでした。私のメモを参照してください。 DBではbigintです。 Javascriptはbigintを扱うことができないので、それらを取り除くときにVarCharとしてキャストしなければなりませんでしたが、文字列はうまくいきます。

+0

比較するコードを表示します。 – WillardSolutions

+0

私は、より多くのランダムな文字を文字列に追加して、それをより違ったものにしたり、ハッシュや何かにすることを考えましたが、同じ問題に遭遇するかもしれないようです。私のモデルでは、Javascriptも同様に問題を抱えていたため、これらのすべてを文字列としてキャストしました。 ColdFusionは、私が思った数のときに、それらをより良く扱うように見えました。 CFが大好きだが、Javascriptはそうではないようだ。 ColdFusionで文字列を比較すると、ColdFusionでの比較が壊れてしまい、数値に戻すことができません。 – Leeish

+0

私は 'hash(a)EQ hash(b)'を実行しようとしましたが、動作しますが、これを処理するためにCFに何かが組み込まれているようです。 – Leeish

答えて

10

短い答え:だから、Long.compareTo()リターン-10、または1のような明白な、Javaメソッドを見落としていないよう。一致するかどうかをテストするために正しい式を使用していることを確認してください。値が等しい場合、結果は0になります。 (ゼロ(0)はCFでfalseと評価されます)。

長い答え: 値は、保存された検索し、特にはここに非常に関連する評価方法。あなたが言及したすべての方法は、CF11の下で私のためにうまくいきました(明白な理由のためにvalを除いて)。これはあなたのコードや環境で何かが異なることを示唆しています。例えば

、CF11とSQL Serverの使用:

CREATE TABLE test 
(
    bigIntValue1 BIGINT 
    , bigIntValue2 BIGINT 
    , varcharValue1 VARCHAR(50) 
    , varcharValue2 VARCHAR(50) 
) 

を以下の試験コード:

writeOutput("<br>qry.bigIntValue1: "& val(qry.bigIntValue1)); 
writeOutput("<br>qry.bigIntValue2: "& val(qry.bigIntValue2)); 
writeOutput("<br>BigInt Val(): "& (val(qry.bigIntValue1) eq val(qry.bigIntValue2))); 
writeOutput("<br>Varchar Val(): "& (val(qry.varcharValue1) eq val(qry.varcharValue2))); 
writeOutput("<br>Long.compareTo: "& qry.bigIntValue1[1].compareTo(qry.bigIntValue2[1])); 
writeOutput("<br>Varchar.compareTo: "& qry.varcharValue1[1].compareTo(qry.varcharValue2[1])); 
writeOutput("<br>Compare(Long, Long) "& compare(qry.bigIntValue1, qry.bigIntValue2)); 
writeOutput("<br>Compare(Varchar, Varchar) "& compare(qry.varcharValue1, qry.varcharValue2)); 

これらの結果を生成:期待、val()比較リターンとして

val(qry.bigIntValue1):  1.00900000006E+016 
val(qry.bigIntValue21): 1.00900000006E+016 
BigInt Val():    YES 
Varchar Val():    YES 

Long.compareTo:   1 
Varchar.compareTo:   2 
Compare(Long, Long):  1 
Compare(Varchar, Varchar): 1 

間違った答えです。なぜなら、この関数は暗黙のうちに大きな数約になります。タイプです。変換されると、これらの近似値は等しいと見なされます。

他のすべての比較は、値が等しくないことを示します。これらの例では異なる機能が使用されていますが、共通する点は1つだけです。値が等しいとみなされる場合はすべて0を返します。それ以外の場合は、値がと異なるであることを示します。CFではゼロ(0)がfalseとして扱われるため、正しい式を使用して等価性と差異をテストしていることを確認してください。

  • Long.compareTo() - (CFでのBigIntを表すために使用されるデータ型)値0この長いロング引数と等しい場合。このLongが数値Longよりも小さい場合は0より小さい値。このロング引数ロング(符号付きの比較)より大きい数値0より大きい値である場合に「
  • String.compareTo()から引数文字列がこの文字列と等しい場合は値0; 0より小さい値、この場合stringはstringのargument than lexicographically lessあり;および0 than greater valueがこのstringはlexicographically stringのargument than greaterあるif

  • Compare(string1, string2) - 」...は、case 2 stringsのsensitive comparisonをPerforms。。?戻り値-1(より大きい)(未満)、0(等しい)または1

+0

機能の仕組みが誤解されました。あなたの完全な答えをありがとう。 – Leeish

3

私はこのための別の簡単な解決策を持っています。私はそれがあなたを助けるかもしれないと思う。値として

<cfset x = 10090000000557765/> 
<cfset y = 10090000000557763/> 
<cfset isZero = PrecisionEvaluate(x-y)/> 
<cfif isZero EQ 0> 
    x and y are equal 
<cfelse> 
    x and y are not equal 
</cfif> 

(倍長等INT、等)は、そのデータ型は、それが算術演算を実行するために問題となる制限超えます。だから私はPrecisionEvaluate()を使用しました。

+1

スマートなアイデア。入力いただきありがとうございます。 – Leeish

+0

コードにエラーがあります。また、「yとyが等しい」とはどういう意味ですか? –

+0

行1 - 変数 'Value1'、行2を設定 - 変数 'Value1'、行3を使用変数 'x'と 'y'を定義していません –