2

我在处理大数和长十进制数时遇到问题,正如其他人使用 PrecisionEvaluate 提到或解决了此类问题一样,我无法使用此类函数获得一致的结果。

此代码的示例:

<cfset n = 0.000000000009>
<cfoutput>#precisionEvaluate(n)#</cfoutput> // this will produce "9E-12"
<cfoutput>#precisionEvaluate("n")#</cfoutput> // this will produce "0.000000000009"

根据Adob​​e 文档,不建议使用 Quote(由于处理效率低下),它应该产生相同的结果,但上述代码并非如此。

结果不一致的进一步试验:

<cfset n = 0.000000000009>
<cfset r = 12567.8903>
<cfoutput>#precisionEvaluate(r * n)#</cfoutput> // this will produce "1.131110127E-7"
<cfoutput>#precisionEvaluate("r * n")#</cfoutput> // this will produce "1.131110127E-7", same as above
<cfoutput>#precisionEvaluate(r / n)#</cfoutput> // this will produce "1396432255555555.55555555555555555556"
<cfoutput>#precisionEvaluate("r / n")#</cfoutput> // this will produce "1396432255555555.55555555555555555556", same as above

有没有人遇到过类似案例的问题?解决不一致的实际解决方案是什么?我尝试过:使用 val() 函数无法解决,因为它仅限于短数字,使用 numberFormat() 函数很困难,因为我们必须传递小数位数才能正确格式化它。

4

1 回答 1

7

当谈到数字时,不要总是相信你在屏幕上看到的东西。这只是数字的“人类友好”表示。在您的情况下,实际结果(或数字)一致的。这只是这些数字如何呈现的问题..

PrecisionEvaluate返回一个java.math.BigDecimal对象。为了在 中显示该对象所代表的数字<cfoutput>,CF 调用该对象的toString()方法。根据 API,toString() 可以使用科学计数法来表示值。这就解释了为什么它用于您的某些值,而不是其他值。(尽管有或没有指数,它仍然代表相同的数字)。但是,如果您希望排除指数,只需使用BigDecimal.toPlainString()

toPlainString() - 返回此 BigDecimal 的字符串表示,不带指数字段....

例子:

<cfscript>
    n = 0.000000000009;
    r = 12567.8903;
    result = precisionEvaluate(r * n);

    WriteOutput( result.getClass().name );
    WriteOutput("<br />result.toString() ="&  result.toString());
    WriteOutput("<br />result.toPlainString() ="&  result.toPlainString());
</cfscript>

结果:

java.math.BigDecimal
result.toString() =1.131110127E-7
result.toPlainString() =0.0000001131110127 
于 2013-09-03T14:32:05.037 回答