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()函数很难,因为我们必须传递小数位数才能正确格式化.
谈到数字,不要总是相信你在屏幕上看到的内容.这只是数字的"人性友好"表示.在您的情况下,实际结果(或数字)是一致的.这只是如何呈现这些数字的问题.
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)
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |