我有一个简单的循环:
<cfoutput>
<cfloop from="0.01" to="0.06" index="i" step="0.01">
<p>i=#i#</p>
</cfloop>
</cfoutput>
输出是:
i=0.01
i=0.02
i=0.03
i=0.04
i=0.05
预期值0.06
未出现!如果我增加或减少&#34; To&#34;通过0.01
然后循环正常工作。
I have created an example of the issue here on TryCF。点击&#34;运行代码&#34;按钮生成输出。
有什么想法吗?
答案 0 :(得分:4)
我的猜测是这里的问题是ColdFusion如何处理数字。它正在转换你的字符串&#34; 0.01&#34;和&#34; 0.06&#34;数字,可能在某些时候失去精确度。记住ColdFusion是松散的类型。
ColdFusion不对变量使用显式类型,而Java是强类型的。但是,ColdFusion数据确实使用底层Java类型来表示数据。
From Java and ColdFusion data type conversions
我在TryCF上修改了ColdFusion示例,试图表明我的观点。我使用javacast()
将数字明确定义为浮点数。 Try the new code here.
<cfloop from="#javacast('float','0.01')#"
to="#javacast('float','0.06')#"
index="i"
step="#javacast('float','0.01')#">
i=#i#<br>
</cfloop>
现在输出预期的六次。
i=0.00999999977648
i=0.019999999553
i=0.0299999993294
i=0.0399999991059
i=0.0499999988824
i=0.0599999986589
然后,您可以在输出这些值时添加NumberFormat()
函数以获得所需的输出。不确定这里需要的精确度。你也可以使用Duncan的例子。
<cfloop from="#javacast('float','0.01')#"
to="#javacast('float','0.06')#"
index="i"
step="#javacast('float','0.01')#">
i=#NumberFormat(i,"9.99")#<br>
</cfloop>
输出:
i=0.01
i=0.02
i=0.03
i=0.04
i=0.05
i=0.06
答案 1 :(得分:1)
听起来像个臭虫。你可以随时这样做,似乎有效:
<cfloop from="1" to="6" index="i" step="1">
i=#i/100#<br>
</cfloop>