我正在尝试检测我是否已经将复数分数的分子和分母乘以足够的次数(乘以10/10),以获得顶部和底部的整数。通常,我的算法是有效的。但是,有时Int()函数并不能像预期的那样工作,我从中得到了很大的收获。以下是我正在运行的程序的简化版本:
<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"我做错了什么?我该如何补偿?
发布于 2012-02-07 06:13:36
Val()似乎也纠正了这个错误:
<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>发布于 2012-02-07 06:53:02
RealNumber = "9.184E+015“
结果是有欺骗性的。如果您使用#RealNumber.toString()#,则实际的值可能类似于9.183999999999998E15。CF对于大多数数学运算,使用近似类型Double。因此,您看到的是floating point numbers的正常行为。如果您需要更高的精度,请使用PrecisionEvaluate。它使用BigDecimals进行算术运算(因为它们比java.lang.Double更精确)。
发布于 2012-02-07 06:05:16
尝试使用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>
https://stackoverflow.com/questions/9167709
复制相似问题