2

他の人がPrecisionEvaluateを使用してそのような問題に言及または解決したように、大きな数値と長い10進数の操作に問題がありますが、そのような関数では一貫した結果を得ることができませんでした.

このコードの例:

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

Adobe Documentationによると、 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

数字に関しては、画面に表示されているものを常に信じるとは限りません。これは、数字の「人間にやさしい」表現にすぎません。あなたの場合、実際の結果(または数値)一貫しています。これらの数値がどのように提示されるかは問題です..

PrecisionEvaluatejava.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 に答える