Integer NEQ Int (Integer) Сумасшествие - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь определить, достаточно ли я умножил числитель и знаменатель на сложную дробь (на 10/10), чтобы получить целые числа сверху и снизу.Часто мой алгоритм работает.Иногда, однако, функция Int() не работает, как ожидалось, и я получаю огромное количество из нее.Вот упрощенная версия того, что я запускаю:

<cfoutput>
    <cfset RealNumber = RandRange(1000, 10000) / 1000 />
    RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
    <cfloop condition="RealNumber NEQ Int(RealNumber)">
        <cfset RealNumber = RealNumber * 10 />
        RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
    </cfloop>
</cfoutput>

В большинстве случаев это получается так, как я хочу, но иногда это выглядит так:

RealNumber = "9.184" Int(RealNumber) = "9"
RealNumber = "91.84" Int(RealNumber) = "91"
RealNumber = "918.4" Int(RealNumber) = "918"
RealNumber = "9184" Int(RealNumber) = "9183"
RealNumber = "91840" Int(RealNumber) = "91839"
RealNumber = "918400" Int(RealNumber) = "918399"
RealNumber = "9184000" Int(RealNumber) = "9183999"
RealNumber = "91840000" Int(RealNumber) = "91839999"
RealNumber = "918400000" Int(RealNumber) = "918399999"
RealNumber = "9184000000" Int(RealNumber) = "9183999999"
RealNumber = "91840000000" Int(RealNumber) = "91839999999"
RealNumber = "918400000000" Int(RealNumber) = "918399999999"
RealNumber = "9.184E+012" Int(RealNumber) = "9.184E+012"
RealNumber = "9.184E+013" Int(RealNumber) = "9.184E+013"
RealNumber = "9.184E+014" Int(RealNumber) = "9.184E+014"
RealNumber = "9.184E+015" Int(RealNumber) = "9.184E+015"

Или даже какэто:

RealNumber = "2.152" Int(RealNumber) = "2"
RealNumber = "21.52" Int(RealNumber) = "21"
RealNumber = "215.2" Int(RealNumber) = "215"
RealNumber = "2152" Int(RealNumber) = "2152"
RealNumber = "21520" Int(RealNumber) = "21520"
RealNumber = "215200" Int(RealNumber) = "215200"
RealNumber = "2152000" Int(RealNumber) = "2152000"
RealNumber = "21520000" Int(RealNumber) = "21520000"
RealNumber = "215200000" Int(RealNumber) = "215200000"
RealNumber = "2152000000" Int(RealNumber) = "2152000000"
RealNumber = "21520000000" Int(RealNumber) = "21520000000"
RealNumber = "215200000000" Int(RealNumber) = "215200000000"
RealNumber = "2.152E+012" Int(RealNumber) = "2.152E+012"
RealNumber = "2.152E+013" Int(RealNumber) = "2.152E+013"
RealNumber = "2.152E+014" Int(RealNumber) = "2.152E+014"
RealNumber = "2.152E+015" Int(RealNumber) = "2.152E+015"
RealNumber = "2.152E+016" Int(RealNumber) = "2.152E+016"

Что я делаю не так и как мне это компенсировать?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

RealNumber = "9.184E + 015"

Вывод обманчивый. Если вы используете #RealNumber.toString()#, реальное значение, вероятно, будет примерно таким: 9.183999999999998E15. CF использует приблизительный тип Double для большинства математических операций. Так что вы видите нормальное поведение для чисел с плавающей запятой . Если вам нужна большая точность, используйте PrecisionEvaluate . Он использует BigDecimals для арифметических операций (потому что они более точны, чем java.lang.Double).

0 голосов
/ 07 февраля 2012

Val (), кажется, исправляет это также:

<cfoutput>

    <cfset RealNumber = RandRange(1000, 10000) / 1000 />
    "#val(RealNumber)#" = INT: "#val(Int(RealNumber))#"<br />
    <cfloop condition="val(RealNumber) NEQ Val(Int(RealNumber))">
        <cfset RealNumber = RealNumber * 10 />
        "#val(RealNumber)#" INT: "#val(Int(RealNumber))#"<br />
    </cfloop>

</cfoutput>
0 голосов
/ 07 февраля 2012

Попробуйте использовать javacast. ColdFusion пытается динамически определить тип вашей переменной и не выполняет большую работу. Javacast покрывает множество грехов.

<cfoutput>
<cfset RealNumber = RandRange(1000, 10000) / 1000 />
RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
<cfloop condition="RealNumber NEQ Int(RealNumber)">
    <cfset RealNumber = RealNumber * 10 />
    RealNumber = "#RealNumber#" Int(RealNumber) = "#javaCast("int", RealNumber)#"<br />
</cfloop>

...