2012-02-06 27 views
0

我试图检测我是否已经乘以复数分数的分子和分母足够多的时间(到10/10),以获得整数在顶部和底部。通常我的算法有效。但有时候,Int()函数不能按预期工作,我从中得到大量数字。下面是我跑什么的简化版本:整数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

''解决问题并获得最少的循环时间。 – 2012-02-07 13:32:11

+0

@Dave - 我对此有点怀疑;)PrecisionEvaluate通常会导致更少的迭代,因为它不使用像9.183999999这样的近似数字。因此,评估9.184需要四(4)次迭代,而不是~13(13)'val'。也就是说,除非您处理数百或数千个数字,否则这并不是一个显着的差异。 – Leigh 2012-02-07 17:58:27

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

This:'“仍然获得巨大的数字。 – 2012-02-07 13:29:48

2

实数= “9.184E + 015”

输出是欺骗性的。如果您使用#RealNumber.toString()#,则实际值可能类似于9.183999999999998E15。 CF对大多数数学运算使用近似类型Double。所以你看到的是floating point numbers的正常行为。如果您需要更高的准确度,请使用PrecisionEvaluate。它使用BigDecimals进行算术运算(因为它们比java.lang.Double更精确)。

+0

'>仍然获得巨大的数字。 – 2012-02-07 13:31:08

+0

这是因为你必须在两个值上使用它,例如'precisionEvaluate(RealNumber * 10)'。否则当你执行数学运算时,CF会回退到使用浮点数。 – Leigh 2012-02-07 17:36:30