ColdFusionのDecimalFormat()関数でこれはどうなっていますか?正しい結果を得るにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1428173

  •  07-07-2019
  •  | 
  •  

質問

<cfset number1 = 20.5/80 * 100 />
<cfset number2 = 18.125 />
<cfset number3 = 6.875 />

<cfoutput>
DecimalFormat(#number1#): #DecimalFormat(number1)#<br />
DecimalFormat(#number2#): #DecimalFormat(number2)#<br />
DecimalFormat(#number3#): #DecimalFormat(number3)#
</cfoutput>

出力:

DecimalFormat(25.625):25.62

DecimalFormat(18.125):18.13

DecimalFormat(6.875):6.88

出力以外:

DecimalFormat(25.625):25.63

DecimalFormat(18.125):18.13

DecimalFormat(6.875):6.88

数学的計算の結果である変数により、DecimalFormat()の動作が異なるようです。 Javaを掘ることなく、簡単に修正できますか?

役に立ちましたか?

解決

問題は DecimalFormat()ではなく、典型的な浮動小数点の丸めエラーだと思います。

参照: PrecisionEvaluate()

他のヒント

DecimalFormatはフォーマット関数です。数学関数ではありません。その仕事はあなたのためにあなたの数を丸めることではありません、残念ながらCFには小数のための良い数学関数が欠けているので、あなたはあなた自身を書かなければなりません。

round()のCF livedocsページで誰かが書いたものです:

 <cffunction name="roundDecimal" returntype="numeric"> 
     <cfargument name="num" type="numeric" required="yes"> 
     <cfargument name="decimal" type="numeric" default="2" required="no"> 

     <cfreturn round(num*10^decimal)/10^decimal /> 
  </cffunction>

簡単な解決策は、行1を number1 = NumberFormat(20.5 / 80 * 100、 '9.999')

に変更することです。

CFのドキュメントを参照してください NumberFormat を実行し、ラウンドでページ検索を実行して特定の情報を確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top