比较十进制值和评估

时间:2019-03-24 13:57:14

标签: coldfusion coldfusion-9 floating-accuracy

我的问题很简单。对于所有问题,以下代码应返回true。但是问题4和更高版本返回false,我的问题是为什么?

1.  <cfif #Evaluate("2 - 1.52")# eq "0.48">true<Cfelse>false</cfif><br>
2.  <cfif #Evaluate("3 - 2.52")# eq "0.48">true<Cfelse>false</cfif><br>
3.  <cfif #Evaluate("4 - 3.52")# eq "0.48">true<Cfelse>false</cfif><br>
4.  <cfif #Evaluate("5 - 4.52")# eq "0.48">true<Cfelse>false</cfif><br>
5.  <cfif #Evaluate("6 - 5.52")# eq "0.48">true<Cfelse>false</cfif><br>
6.  <cfif #javacast("double",Evaluate("6 - 5.52"))# eq "#javacast("double",0.48)#">true<Cfelse>false</cfif><br>
7.  <cfif compare(javacast("double",Evaluate("6 - 5.52")),javacast("double",0.48))>true<Cfelse>false</cfif><br>

1 个答案:

答案 0 :(得分:3)

首先我运行您的代码

1.  <cfif #Evaluate("2 - 1.52")# eq "0.48">true<Cfelse>false</cfif><br>
2.  <cfif #Evaluate("3 - 2.52")# eq "0.48">true<Cfelse>false</cfif><br>
3.  <cfif #Evaluate("4 - 3.52")# eq "0.48">true<Cfelse>false</cfif><br>
4.  <cfif #Evaluate("5 - 4.52")# eq "0.48">true<Cfelse>false</cfif><br>
5.  <cfif #Evaluate("6 - 5.52")# eq "0.48">true<Cfelse>false</cfif><br>

然后我将其兰德不带字符串比较

1.  <cfif Evaluate("2 - 1.52") eq 0.48>true<Cfelse>false</cfif><br>
2.  <cfif Evaluate("3 - 2.52") eq 0.48>true<Cfelse>false</cfif><br>
3.  <cfif Evaluate("4 - 3.52") eq 0.48>true<Cfelse>false</cfif><br>
4.  <cfif Evaluate("5 - 4.52") eq 0.48>true<Cfelse>false</cfif><br>
5.  <cfif Evaluate("6 - 5.52") eq 0.48>true<Cfelse>false</cfif><br>

我知道了

enter image description here

接下来,我只是<cfoutput>将值

<cfoutput>
1.  #Evaluate("2 - 1.52")#<br>
2.  #Evaluate("3 - 2.52")#<br>
3.  #Evaluate("4 - 3.52")#<br>
4.  #Evaluate("5 - 4.52")#<br>
5.  #Evaluate("6 - 5.52")#<br>
</cfoutput>

enter image description here

乍一看看起来一样

但是考虑

<cfoutput>
1.  #(2 - 1.52 - 0.48)#<br>
2.  #(3 - 2.52 - 0.48)#<br>
3.  #(4 - 3.52 - 0.48)#<br>
4.  #(5 - 4.52 - 0.48)#<br>
5.  #(6 - 5.52 - 0.48)#<br>
</cfoutput>

enter image description here

您基本上遇到了四舍五入问题。 ... E-016在左边很多数字。

我如何处理这些问题 如果ColdFusion变量是数字,则几乎任何东西都可以将其转换为浮点数。您使用的是小数,这就是为什么它成为浮点数的原因。浮点(几乎)始终是近似值。因此,没有这样的副作用,您将无法进行直接比较。

如果您确实需要进行这样的比较,请乘以100(一个整数),然后将值转换为整数,这样您的状态就会更好。

OT的种类

Square的电子商务API需要一些时间。所有的钱都以美分计量。需要一段时间才能习惯,但是他们这样做是为了避免出现此类问题。

根据Ageax建议进行更新

考虑 #Evaluate(“ 5-4.52”)。toString()#
#PrecisionEvaluate(5-4.52).toString()#

结果为

enter image description here