为什么Coldfusion判断这些数字不相等?

4
为什么ColdFusion 8将47.0000 * 15.40 eq 723.8评估为false?
<cfset test = false />
<cfset a = 47.0000 />
<cfset b = 15.40 />
<cfset c = 723.8 />

<cfif (a * b) eq c>
  <cfset test = true />
</cfif>

<cfdump "#test#">

测试结果为false。


7
浮点数舍入误差 - 请参考http://corfield.org/entry/More_on_Floating_Point - Peter Boughton
3
因为真正的答案可能会像723.99999999999912334123412545或其他类似的数字一样。 - Marc B
是的,看起来是723.8000000000001。 - Jason M
1个回答

15

您可以使用PrecisionEvaluate()函数,使CF在进行数学运算时使用BigDecimals。

<cfset test = false />
<cfset a = 47.0000 />
<cfset b = 15.40 />
<cfset c = 723.8 />

<cfif PrecisionEvaluate(a * b) eq c>
  <cfset test = true />
</cfif>

<cfdump var="#test#" abort="true">

这导致了预期的答案为true。


1
有趣。a * b 返回 723.8000000000001,但 PrecisionEvaluate(a * b) 返回 723.8000000000000。 - Jason M
3
因为前者返回一个java.lang.Double,而后者使用(并返回)一个更精确的java.math.BigDecimal。在ColdFusion浮点数..上搜索,会有大量相关主题讨论。 - Leigh
如果您仍然使用CFMX7或更早版本,则可以使用createObject("java", "java.math.BigDecimal")来利用Java类。 - leokhorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接