步进0.01到0.06时CFLoop无法正常工作吗?

时间:2015-10-12 12:56:05

标签: coldfusion coldfusion-9

我有一个简单的循环:

<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;按钮生成输出。

有什么想法吗?

2 个答案:

答案 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>