我只是碰到一个奇怪的形势下应运而生。为什么下面的代码不返回0?相反,它会返回一个非常小的负数。
<cfset x = 5448.10-3311.23-2136.87>
<cfoutput>x=#x#</cfoutput>
上面的代码将输出:X = 4.54747350886E-013
我跑上述二者在CF9和CF10具有相同的结果的代码。
任何帮助,非常感谢。
我只是碰到一个奇怪的形势下应运而生。为什么下面的代码不返回0?相反,它会返回一个非常小的负数。
<cfset x = 5448.10-3311.23-2136.87>
<cfoutput>x=#x#</cfoutput>
上面的代码将输出:X = 4.54747350886E-013
我跑上述二者在CF9和CF10具有相同的结果的代码。
任何帮助,非常感谢。
<cfset x = PrecisionEvaluate(5448.10-3311.23-2136.87)>
<cfoutput>x=#x#</cfoutput>
文件为PrecisionEvaluate()
: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7fd9.html
正如其他人所说,它是浮点精度相关。我只是想指出的分辨率,如果你想获得一个合理的结果
<cfset x1 = 5448.19-3311.23-2136.87 />
<cfset x2 = numberformat(x1, "9.99") />
<cfoutput>x1=#x1#<br />x2=#x2#</cfoutput>
结果
x1=0.0899999999997
x2=0.09
NumberFormat的功能会给出面膜当数四舍五入到指定的小数位数。
是否使用双精度? – 2012-05-03 18:23:12
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems –
@RiverC - +1。如你所怀疑的,是的。如果你不熟悉CF,它大部分是无类型的,但是它是建立在Java之上的。当使用数学运算符时,数值会隐式转换为'java.lang.Double'。 – Leigh