ColdFusion Round功能

时间:2014-12-15 22:22:09

标签: math coldfusion rounding

今天我遇到了意想不到的行为或者缺乏ColdFusion的知识9,10,11 Round功能在这里是我的场景

回合(28.5)--->结果是预期的29 回合(0.285 * 100)--->结果是28预计不会 回合(precisionEvaluate(0.285 * 100))--->结果是29使用precisionEvaluate!
回合(评估(0.285 * 100))--->结果是29使用Evaluate!
这不是大小数,为什么我需要在数字上使用precisionEvaluate或Evaluate?

在进一步的研究中,我发现了更有趣的行为 回合(0.285 * 100)结果是28 --WHY?我期待29--!
回合(0.295 * 100)结果是30 ----正确!
回合(0.275 * 100)结果是28 ----正确!
回合(0.185 * 100)结果为19 ----正确!
回合(0.385 * 100)结果是39 ----正确!

0.285 * 100有什么大不了的?

1 个答案:

答案 0 :(得分:13)

这不是十进制数的精度,而是底层浮点数如何存储在Java中。这表明:

<cfoutput>
<cfloop array="#[0.275,0.285,0.295]#" index="s">
#s.getClass().getName()#
<cfset f1 = s + 0>
#f1.getClass().getName()#
#f1.toString()#
<cfset f2 = f1*100>
#f2.toString()#
#round(f2)#<br>
</cfloop>
</cfoutput>

输出:

  

java.lang.String java.lang.Double 0.275 27.500000000000004 28

     

java.lang.String java.lang.Double 0.285 28.499999999999996 28

     

java.lang.String java.lang.Double 0.295 29.5 30

我只能假设在执行<cfset f1 = s + 0>时,从字符串转换为浮点数时,CF使用更好的精度,因为那里没有狡猾的舍入。然而,在执行乘法步骤之后,我们得到准确性错误出血.28.5最终只有28.5,所以舍入到28不是29.这只是一个二进制分数算术问题。

顺便说一下,0.285并没什么特别之处。许多数字同样受到影响(看看范围从0.005到5.05)。你碰巧选择了一堆不是(除了0.285)。