ColdFusion大数字比较

时间:2016-05-12 16:11:08

标签: coldfusion precision bigint

ColdFusion认为10090000000557765 = 10090000000557763

我明白了,但我需要知道ColdFusion知道它们不一样的最佳方法。我读到了Compare()方法,但也返回true。我把它们作为字符串输出并返回true。

我考虑过编写一个自定义函数来将字符串分成两部分,单独比较每个部分然后返回true / false但这看起来很愚蠢。

我试过以下内容:

Val(a) EQ Val(b)
ToString(a) EQ ToString(b)
a.compareTo(b)

澄清。我正在使用我无法控制的数据库使用bigint。我很早就知道Javascript无法处理这些因此我在模型中将所有bigint字段转换为varchar。然而,现在CF有问题比较字符串,我似乎无法将它们转换回数字。

示例我刚刚做了:

<cfif '10090000000557765' EQ '10090000000557763'>
True
<cfelse>
False
</cfif>

http://cflive.net/上,它返回true。看我的笔记。在数据库中,他们是bigint。我不得不将它们作为VarChar投射出来,因为Javascript无法处理bigint,但它确实很好。

2 个答案:

答案 0 :(得分:10)

简答:为了不忽视显而易见的Java方法,例如Long.compareTo()返回-101。确保使用正确的表达式来测试相等性。当值相等时,结果为0。 (零(0)计算为CF中的false

更长的回答: 如何存储,检索和特别评估的值在这里是非常相关的。你提到的所有方法在CF11下都适合我(val除外,原因很明显)。这表明您的代码或环境有所不同。

例如,使用CF11和SQL Server:

CREATE TABLE test
(
    bigIntValue1 BIGINT
    , bigIntValue2 BIGINT
    , varcharValue1 VARCHAR(50)
    , varcharValue2 VARCHAR(50)
)

以下测试代码:

writeOutput("<br>qry.bigIntValue1: "&  val(qry.bigIntValue1) );
writeOutput("<br>qry.bigIntValue2: "&  val(qry.bigIntValue2) );
writeOutput("<br>BigInt Val(): "& ( val(qry.bigIntValue1) eq val(qry.bigIntValue2)) );
writeOutput("<br>Varchar Val(): "& ( val(qry.varcharValue1) eq val(qry.varcharValue2)) );
writeOutput("<br>Long.compareTo: "& qry.bigIntValue1[1].compareTo(qry.bigIntValue2[1]));
writeOutput("<br>Varchar.compareTo: "& qry.varcharValue1[1].compareTo(qry.varcharValue2[1]));
writeOutput("<br>Compare(Long, Long) "& compare(qry.bigIntValue1, qry.bigIntValue2));
writeOutput("<br>Compare(Varchar, Varchar) "& compare(qry.varcharValue1, qry.varcharValue2));

产生以下结果:

val(qry.bigIntValue1):     1.00900000006E+016
val(qry.bigIntValue21):    1.00900000006E+016
BigInt Val():              YES
Varchar Val():             YES

Long.compareTo:            1
Varchar.compareTo:         2
Compare(Long, Long):       1
Compare(Varchar, Varchar): 1 

正如预期的那样,val()比较会返回错误的答案,因为该函数会隐式地将大数字转换为近似类型。转换后,这些近似值被认为是相等的。

所有其他比较表明值不相等。虽然这些示例使用不同的函数,但它们都有一个共同点:当值被认为相等时,它们都返回0。其他任何表示值不同。由于零(0)在CF中被视为false,因此请确保使用正确的表达式来测试相等性和差异。

  • Long.compareTo() - (用于在CF中表示BigInt的数据类型)如果此Long等于参数Long,则值为0;如果此Long在数值上小于参数Long,则小于0的值;如果此Long在数值上大于参数Long(签名比较),则值大于0。“
  • String.compareTo() - 如果参数字符串等于此字符串,则为0;如果此字符串按字典顺序小于字符串参数,则小于0的值;如果此字符串按字典顺序大于字符串参数,则值大于0.

  • Compare(string1, string2) - “...对两个字符串执行区分大小写的比较。?返回-1(小于),0(相等)或1(大于)

答案 1 :(得分:3)

我有另一个简单的解决方案。我认为这对你有帮助。

TravelEntryList = $employeeTravel->Find("employee = ? 
and (date(travel_date) <= ? or ? <=  date(return_date))",array($employeeId,$start,$end));

当值超过其数据类型(如int,longInt等)限制时,执行算术运算会出现问题。所以我使用了PrecisionEvaluate()