Почему Coldfusion оценивает эти числа как неравные?

Почему coldfusion 8 оценивает 47,0000 * 15,40 экв. 723,8 как ложное?

<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.


person Jason M    schedule 30.01.2013    source источник
comment
Ошибки округления с плавающей запятой — см. corfield.org/entry/More_on_Floating_Point   -  person Peter Boughton    schedule 30.01.2013
comment
потому что реальный ответ будет что-то вроде 723.99999999999912334123412545 или что-то в этом роде.   -  person Marc B    schedule 30.01.2013
comment
Да, похоже на 723.8000000000001.   -  person Jason M    schedule 30.01.2013


Ответы (1)


Вы можете использовать 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.

person Busches    schedule 30.01.2013
comment
Интересный. a * b возвращает 723,8000000000001, но PrecisionEvaluate(a * b) возвращает 723,80000000000000 - person Jason M; 30.01.2013
comment
@JasonM - потому что первый возвращает java.lang.Double. Последний возвращает использует (и возвращает) более точное значение java.math.BigDecimal. Выполните поиск по ColdFusion с плавающей запятой.. по этому поводу есть множество тем. - person Leigh; 30.01.2013
comment
Если вы все еще застряли с CFMX7 или более ранней версией, вы можете вместо этого использовать createObject(java, java.math.BigDecimal) для использования класса Java. - person leokhorn; 01.07.2014