2012-02-06 6 views
0

私は、上と下の両方の整数を得るのに十分な時間(10/10まで)の分数と分数を乗算したかどうかを検出しようとしています。しばしば私のアルゴリズムが動作します。しかし、時々、Int()関数が期待どおりに機能せず、その中から膨大な数値が得られることがあります。ここで私が実行しているかの簡易版は、次のとおりです。Integer NEQ Int(整数)Craziness

<cfoutput> 
    <cfset RealNumber = RandRange(1000, 10000)/1000 /> 
    RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br /> 
    <cfloop condition="RealNumber NEQ Int(RealNumber)"> 
     <cfset RealNumber = RealNumber * 10 /> 
     RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br /> 
    </cfloop> 
</cfoutput> 

これは私が欲しいものを取得しますが、時にはそれがこのようになりますほとんどの時間:このような

RealNumber = "9.184" Int(RealNumber) = "9" 
RealNumber = "91.84" Int(RealNumber) = "91" 
RealNumber = "918.4" Int(RealNumber) = "918" 
RealNumber = "9184" Int(RealNumber) = "9183" 
RealNumber = "91840" Int(RealNumber) = "91839" 
RealNumber = "918400" Int(RealNumber) = "918399" 
RealNumber = "9184000" Int(RealNumber) = "9183999" 
RealNumber = "91840000" Int(RealNumber) = "91839999" 
RealNumber = "918400000" Int(RealNumber) = "918399999" 
RealNumber = "9184000000" Int(RealNumber) = "9183999999" 
RealNumber = "91840000000" Int(RealNumber) = "91839999999" 
RealNumber = "918400000000" Int(RealNumber) = "918399999999" 
RealNumber = "9.184E+012" Int(RealNumber) = "9.184E+012" 
RealNumber = "9.184E+013" Int(RealNumber) = "9.184E+013" 
RealNumber = "9.184E+014" Int(RealNumber) = "9.184E+014" 
RealNumber = "9.184E+015" Int(RealNumber) = "9.184E+015" 

あるいは:

RealNumber = "2.152" Int(RealNumber) = "2" 
RealNumber = "21.52" Int(RealNumber) = "21" 
RealNumber = "215.2" Int(RealNumber) = "215" 
RealNumber = "2152" Int(RealNumber) = "2152" 
RealNumber = "21520" Int(RealNumber) = "21520" 
RealNumber = "215200" Int(RealNumber) = "215200" 
RealNumber = "2152000" Int(RealNumber) = "2152000" 
RealNumber = "21520000" Int(RealNumber) = "21520000" 
RealNumber = "215200000" Int(RealNumber) = "215200000" 
RealNumber = "2152000000" Int(RealNumber) = "2152000000" 
RealNumber = "21520000000" Int(RealNumber) = "21520000000" 
RealNumber = "215200000000" Int(RealNumber) = "215200000000" 
RealNumber = "2.152E+012" Int(RealNumber) = "2.152E+012" 
RealNumber = "2.152E+013" Int(RealNumber) = "2.152E+013" 
RealNumber = "2.152E+014" Int(RealNumber) = "2.152E+014" 
RealNumber = "2.152E+015" Int(RealNumber) = "2.152E+015" 
RealNumber = "2.152E+016" Int(RealNumber) = "2.152E+016" 

私は間違っていますが、どうすればこれを補うことができますか?

答えて

-1

ヴァル()もそれを修正するようだ:

<cfoutput> 

    <cfset RealNumber = RandRange(1000, 10000)/1000 /> 
    "#val(RealNumber)#" = INT: "#val(Int(RealNumber))#"<br /> 
    <cfloop condition="val(RealNumber) NEQ Val(Int(RealNumber))"> 
     <cfset RealNumber = RealNumber * 10 /> 
     "#val(RealNumber)#" INT: "#val(Int(RealNumber))#"<br /> 
    </cfloop> 

</cfoutput> 
+0

'は問題を解決し、ループ時間を最小限に抑えます。 –

+0

@Dave - それについて少し懐疑的です;)PrecisionEvaluateは、通常、9.183999999のようなおおよその数字を使用していないため、はるかに少ない反復回数で終了します。したがって、9.184を評価するには、valを使用して13回(13回)ではなく、4回の反復が必要です。つまり、数百または数千の数字を処理していない限り、全体的に大きな違いはありません。 – Leigh

0

javacastを使用してください.. ColdFusionは動的に変数の型を決定しようとしていますが、大きな仕事をしていません。Javacastには多数の罪があります。

<cfoutput> 
<cfset RealNumber = RandRange(1000, 10000)/1000 /> 
RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br /> 
<cfloop condition="RealNumber NEQ Int(RealNumber)"> 
    <cfset RealNumber = RealNumber * 10 /> 
    RealNumber = "#RealNumber#" Int(RealNumber) = "#javaCast("int", RealNumber)#"<br /> 
</cfloop> 

+0

これは、は依然として巨大な数値を取得します。 –

2

実数= "9.184E + 015"

出力は欺瞞です。 #RealNumber.toString()#を使用する場合、実際の値はおそらく9.183999999999998E15のようなものです。 CFは、大部分の数学演算に近似タイプDoubleを使用します。あなたが見ているのはfloating point numbersの正常な動作です。正確性が必要な場合は、PrecisionEvaluateを使用してください。算術演算にはBigDecimalsを使用します(これらはjava.lang.Doubleよりも正確です)。

+0

'は依然として大きな数字を取得します。 –

+0

これは、両方の値、つまり 'precisionEvaluate(RealNumber * 10)'で使用する必要があるためです。それ以外の場合は、数学演算を実行するときにCFが浮動小数点数に戻ります。 – Leigh

関連する問題