Сравните десятичные значения с оценкой - PullRequest
0 голосов
/ 24 марта 2019

Мой вопрос очень прост. Следующий код должен возвращать 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 Ответ

3 голосов
/ 24 марта 2019

Сначала я запустил ваш код с

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 (целое число) и приведите значения к целым числам, и вы должны быть в лучшей форме.

Вид ОТ

Некоторое время работает с API электронной коммерции Square. Все деньги измеряются в центах. Требуется время, чтобы привыкнуть, но они делают это, чтобы избежать подобных проблем.

Обновление на основе Ageax предложение

Рассмотрим #Evaluate ("5 - 4,52"). ToString () #
#PrecisionEvaluate (5 - 4.52) .toString () #

Результат:

enter image description here

...