今天我遇到了意想不到的行为或者缺乏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 :(得分: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.这只是一个二进制分数算术问题。