Coldfusion中PrecisionEvaluate的科学记数法

Pra*_*tha 2 coldfusion numbers scientific-notation

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

此代码示例:

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

根据Adobe文档,不建议使用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
Run Code Online (Sandbox Code Playgroud)

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

Lei*_*igh 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>
Run Code Online (Sandbox Code Playgroud)

结果:

java.math.BigDecimal
result.toString() =1.131110127E-7
result.toPlainString() =0.0000001131110127 
Run Code Online (Sandbox Code Playgroud)